Регулярное выражение Python для сопоставления с файлом в списке файлов (получение ошибки)

StackOverflow https://stackoverflow.com/questions/2344193

  •  23-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь использовать регулярное выражение в 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, которое является файловым объектом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top