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

#python #regex #string

#python #регулярное выражение #строка

Вопрос:

Это для работы, поэтому я изменил расширения и файлы, чтобы защитить невинных.

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

Тест 1

 text = 'Some text here: * my_file_stuff.mat * other_file * third_file *'

FILE_REG_EX = r'([w] _ [w] .*[py|mat]*)'
res = re.findall(FILE_REG_EX, text)

print(res)
 

Вывод 1

 python test_regex.py

['my_file_stuff.mat', 'other_file', 'third_file']
 

Проблема в том, что это не работает для таких вещей, как это

Тест 2

 text = '|my_file|another_file.mat|O_HERES_ONE|_O_HERES_ANOTHER| | | |'

FILE_REG_EX = r'([w] _ [w] .*[py|mat]*)'
res = re.findall(FILE_REG_EX, text)

print(res)
 

Вывод 2

 python test_regex.py
['my_file|a', 'nother_file.mat|', 'O_HERES_ONE|', '_O_HERES_ANOTHER|']
 

Я изменил свое регулярное выражение, чтобы включить вертикальную полосу, здесь

Тест 3

 text = '|my_file|another_file.mat|O_HERES_ONE|_O_HERES_ANOTHER| | | |'

FILE_REG_EX = r'([w] _ [w] .*[py|plot]*)|'
res = re.findall(FILE_REG_EX, text)

print(res)
 

Вывод 3

  python test_regex.py
['my_file', 'another_file.mat', 'O_HERES_ONE', 'O_HERES_ANOTHER']
 

и это работает для второго, но теперь не для первого. Частично проблема в том, что я буду искать текстовое описание, чтобы посмотреть, где находится файл, и я не могу знать, какое форматирование он будет использовать для файлов, только то, что они будут иметь вид MY_FILE_HERE01.py с расширением или без него.

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

Ответ №1:

Вы можете использовать это регулярное выражение для обоих типов входных данных:

 [a-zA-Zd] _w (?:.(?:py|mat))?
 

Демонстрация регулярных выражений

Подробности регулярных выражений:

  • [a-zA-Zd] : Сопоставление 1 букв или цифр
  • _ : Сопоставление подчеркивания
  • w : Сопоставление символов 1 word
  • (?:.(?:py|mat))? : Необязательно сопоставлять .py или .mat

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

1. Фантастика! Это делает свое дело. Можете ли вы объяснить вопросительный знак с двоеточиями? Я знаю, что вопросительный знак сам по себе в чем-то вроде «Здесь?» сделает e необязательным и сопоставит ее и здесь. Я думаю, то же самое работает для группировок круглых скобок. Но я не совсем уверен, что понимаю, что оно используется с двоеточием в начале группировки.

2. (?: запускает группу без захвата. Это группа, которая не захватывается.

Ответ №2:

Это то, что вы ищете?

|?s*([wd] [_wd] (?:.?[wd] [_wd] ) )s*|?

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

1. Это близко, но не совсем. Это берет текст из «Some text here:», а также выдает этот вывод [‘Some’, ‘text’, ‘here’, ‘my_file_stuff.py ‘, ‘другой файл’, ‘третий файл’]

2. Ах, я вижу, что вы пытаетесь сделать сейчас. Если в описании файла обязательно будет подчеркивание _ , то приведенный выше ответ будет работать, я думал, что файл может быть чем-то вроде myfile . Приветствия! =)