Регулярное выражение для сопоставления имен файлов

#python #regex #python-3.x

#python #регулярное выражение #python-3.x

Вопрос:

Мой скрипт на python выполняет следующее:

  1. возьмите данные корневого каталога от пользователя.
  2. сканируйте все подкаталоги на наличие файлов изображений.
  3. создайте список всех допустимых имен файлов.

где допустимое расширение файла:

 "<DDMMYY><a 6 letter word><a 8 letter OR digit word><coutner>_Plot<3 digit number>_row<3 digit number>.jpg"
 

например:

«190419yotamryotam123001_Plot003_row004.jpg «

Я работаю с .json в качестве файла конфигурации, поэтому я хочу иметь запись для хранения значения регулярного выражения для формата расширения файла.

Я предоставил следующее регулярное выражение:

 FORMAT = r'([0-3][0-9][0-1][0-9][0-9][0-9])\([a-zA-Z]{6})\([a-zA-Z0-9]{8})\\d{4}_Plot\d{3}_row\d{3}\.[jpeg]'
 

Тем не менее, каждый раз, когда я запускаю прикрепленный код, я продолжаю получать «None» в качестве вывода из re.match()

 match = re.match(FORMAT, "190419yotamryotam123001_Plot003_row004.jpg")
print(match)
 

Есть идеи по изменениям, которые заставят его работать?

Комментарии:

1. Ваши \d{4} совпадения , а затем 4 d с. \.[jpeg] соответствует a , а затем любому символу, а затем j или p или e или g

2. Поскольку вы используете необработанную строку ( r'...' ) \ , она сохраняется как две обратные косые черты, а не одна. \\d Соответствует трем обратным косым чертам, затем цифре. Попробуйте распечатать FORMAT , и вы поймете, что я имею в виду. Удвоение обратной косой черты сводит на нет цель использования необработанной строки.

Ответ №1:

импортировать повторно

текст = "190419\yotamr\yotam123\0001_Plot003_row004.jpg "

формат = r"[0-9][0-9][0-9][0-9][0-9][0-9]\[ a-zA-Z]{6}\[a-zA-Z0-9]{8}\[0-9]{4} _Плот[0-9]{3}_row[0-9]{3}.jpg"

результат = повторный поиск (формат, текст)

печать (результат)

Комментарии:

1. Спасибо, Гохан, теперь я вижу проблему. Когда я загружаю ключ «формат» из . в файле json я получаю строку, а не регулярное выражение. есть идеи, как это решить?

Ответ №2:

У вас есть ошибки в вашем регулярном выражении. Вот правильное:

 FORMAT2 = re.compile(r'([0-3][0-9][0-1]([0-9]{3}))\([a-zA-Z]{6})\([a-zA-Z0-9]{8})\([0-9]{4})_Plot([0-9]{3})_row([0-9]{3}).jpe?g')
 
 >>> print(re.search(FORMAT2, "190419\yotamr\yotam123\0001_Plot003_row004.jpg"))

<_sre.SRE_Match object; span=(0, 46), match='190419\yotamr\yotam123\0001_Plot003_row004.jpg>
 

Также не забудьте использовать r предикат в строках регулярных выражений: r'WAKA[0-9]WAKA' и для экранирования строки, которую вы проверяете ( r например, с помощью предиката или экранирования вручную), потому что ваша строка:

 "190419yotamryotam123001_Plot003_row004.jpg"
                       ^
                 here--|
 

содержит нулевой байт '' , который преобразуется в 'x00' .