Регулярное выражение Python для сопоставления с файлом в списке файлов (получение ошибки)
Вопрос
Я пытаюсь использовать регулярное выражение в 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)
он по-прежнему выдает эту ошибку.Я не понимаю, как я мог получить от этого несбалансированную скобку.
Решение
Гордон,
мне кажется, что проблема кроется в данных.Вы компилируете неинспектированные строки из filelist
в регулярное выражение, не обращая внимания на то, что они могут содержать метасимволы, относящиеся к движку регулярных выражений.
В вашем цикле for добавьте print the_file
перед вызовом re.compile (нет проблем в том, что вы повторно используете имя в качестве итератора цикла, которое ранее ссылалось на объект file), так что вы можете видеть, какие строки на самом деле поступают из списка файлов.Или, что еще лучше, запустите все экземпляры the_file через re.escape
перед передачей их в re.compile.Это превратит все мета-символы в их обычный эквивалент.
Другие советы
Где находится шаблон регулярного выражения?Вы пытаетесь использовать имена файлов, содержащиеся в одном файле, в качестве шаблонов для поиска в другом файле?Если это так, вы захотите пройти через the_file
с чем-то вроде
for the_pattern in the_file:
p = re.compile(the_pattern, re.IGNORECASE)
m = p.search(the_log)
...
Согласно питон re.compile
Документация, первый аргумент к re.compile()
должен быть шаблон регулярного выражения в виде строки.
Но возвращаемое значение open()
является файловым объектом, который вы присваиваете the_file
и переходите к re.compile()
....
То, к чему вы привязываетесь, назовите the_file
в вашем первом фрагменте есть файловый объект, даже если вы говорите, что это "сохранено как строка", имя файла (т.е.строка) на самом деле названа theLogFile
но то, что вы пытаетесь превратить в ПОВТОРНЫЙ объект, это не theLogFile
(строка), это the_file
(теперь закрытый файловый объект).Учитывая это, ошибка несколько причудлива (можно было бы ожидать, что TypeError
), но ясно, что вы будет получите сообщение об ошибке на re.compile
.
the_file - файл должна быть строка.В приведенном выше коде the_file - это возвращаемое значение open, которое является файловым объектом.