Python Regex для сопоставления файла в списке файлов (получение ошибки) - PullRequest
2 голосов
/ 26 февраля 2010

Я пытаюсь использовать регулярное выражение в Python, чтобы сопоставить файл (сохраненный в виде строки, т.е. "/volumes/footage/foo/bar.mov") с файлом журнала, который я создаю, который содержит список файлов. Но когда я запускаю скрипт, он выдает мне эту ошибку: sre_constants.error: unbalanced parenthesis. Код, который я использую, это:

Чтобы прочитать файл:

theLogFile = The_Root_Path + ".processedlog"
if os.path.isfile(theLogFile):
        the_file = open(theLogFile, "r")
    else:
        open(theLogFile, 'w').close()
        the_file = open(theLogFile, "r")
    the_log = the_file.read()
    the_file.close()

Затем внутри цикла for я переназначаю (я не понимал, что делаю это, пока не опубликовал этот вопрос) переменную the_file как строку из списка файлов (полученную при запуске через папку и ее подмножеств и захватывает все имена файлов), затем попробуйте использовать регулярное выражение, чтобы увидеть, присутствует ли это имя файла в файле журнала:

for the_file in filenamelist:
    p = re.compile(the_file, re.IGNORECASE)
    m = p.search(the_log)

Каждый раз, когда он попадает в часть кода re.compile(), он выдает эту ошибку. И если я попытаюсь вырезать это и использовать re.search(the_file, the_log), он все равно выплевывает эту ошибку. Я не понимаю, как я мог получить несбалансированные скобки из этого.

Ответы [ 4 ]

3 голосов
/ 26 февраля 2010

Где находится шаблон регулярного выражения? Вы пытаетесь использовать имена файлов, содержащиеся в одном файле, в качестве шаблонов для поиска в другом файле? Если это так, вы захотите пройти через the_file с чем-то вроде

for the_pattern in the_file:
    p = re.compile(the_pattern, re.IGNORECASE)
    m = p.search(the_log)
    ...

Согласно документации Python re.compile , первым аргументом re.compile() должен быть шаблон регулярного выражения в виде строки.

Но возвращаемое значение open() является файловым объектом, который вы присваиваете the_file и передаете re.compile() ....

2 голосов
/ 26 февраля 2010

Гордон,

мне кажется, что проблема в данных. Вы компилируете непредусмотренные строки из filelist в регулярное выражение, не обращая внимания на то, что они могут содержать метасимволы, относящиеся к механизму регулярного выражения.

В вашем цикле for добавьте print the_file перед вызовом re.compile (нет проблем, если вы повторно используете имя в качестве итератора цикла, который ранее ссылался на объект файла), чтобы вы могли увидеть строки на самом деле приходят из списка файлов. Или, что еще лучше, запустите все экземпляры the_file до re.escape, прежде чем передавать их в re.compile. Это превратит все метасимволы в их обычный эквивалент.

1 голос
/ 26 февраля 2010

the_file должно быть строкой. В приведенном выше коде the_file является возвращаемым значением open, который является файловым объектом.

1 голос
/ 26 февраля 2010

То, что вы связываете с именем the_file в вашем первом фрагменте, является файловым объектом , даже если вы говорите, что оно «сохранено как строка», имя файла (то есть строка) фактически называется theLogFile но вы пытаетесь превратить объект RE в , а не theLogFile (строка), это the_file (теперь закрытый файловый объект). Учитывая это, ошибка несколько странная (можно было бы ожидать TypeError), но ясно, что вы получите ошибку при re.compile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...