Почему мое регулярное выражение не работает на входе из file.read ()? - PullRequest
2 голосов
/ 01 июня 2011

У меня есть фрагмент кода, который мне нужно удалить из нескольких файлов, который начинается примерно так:

<?php
//{{56541616

и заканчивается так:

//}}18420732
?>

, где обе строки чиселможет быть любой последовательностью букв и цифр (не одной и той же).

Я написал программу на Python, которая будет возвращать всю входную строку, за исключением этой проблемной строки:

def removeInsert(text):
    m = re.search(r"<\?php\n\/\/\{\{[a-zA-Z0-9]{8}.*\/\/\}\}[a-zA-Z0-9]{8}\n\?>", text, re.DOTALL)
    return text[:m.start()] + text[m.end():]

Эта программа работаетздорово, когда я вызываю его с помощью removeInsert ("" "[file text]" "") - тройные кавычки позволяют читать его как многострочное.

Я попытался расширить это, чтобы открыть файл и передать строковое содержимое файла в removeInsert () с помощью этого:

def fileRW(filename):
    input_file = open(filename, 'r')
    text = input_file.read()
    newText = removeInsert(text)
    ...

Однако, когда я запускаю fileRW ([input-file)]), Я получаю эту ошибку:

return text[:m.start()] + text[m.end():]
AttributeError: 'NoneType' object has no attribute 'start'

Я могу подтвердить, что «текст» в последнем коде на самом деле является строкой и содержит код проблемы, но кажется, что код removeInsert () нене работает над этой строкой.Мое лучшее предположение заключается в том, что это связано с тройным цитированием, которое я делаю при вводе строки вручную в removeInsert ().Возможно, текст, который fileRW () передает в removeInsert (), не имеет тройных кавычек (я пробовал разные способы заставить его использовать тройные кавычки (добавлено "\" \ "\" "), но это не работает)Я не знаю, как это исправить, и не могу найти информацию об этом в моем поиске в Google. Есть предложения?

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Ваше регулярное выражение использует только \n для строк.Ваш текстовый редактор может вставить символ возврата каретки и новой строки: \r\n.Попробуйте изменить \n в своем регулярном выражении на (\r\n|\r|\n).

0 голосов
/ 02 июня 2011

Сохраните \n в ваших регулярных выражениях и откройте файл как:

input_file= open(filename, 'rU')

Обратите внимание на extra U в режиме.Это позволит вашему коду работать, даже если он используется в других операционных системах или для файлов, имеющих «чужой» конец строки.

...