#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
. Приветствия! =)