Флаг re.MULTILINE мешает завершению строки $ operator - PullRequest
0 голосов
/ 14 июля 2020

Извините, если это повторяющийся / basi c вопрос, мне не удалось найти похожие вопросы.

У меня есть следующая многострочная строка

my_txt = """
foo.exe\n
bar.exec\n
abab.exe\n
"""

(символы новой строки не на самом деле не написаны в моем коде, я поместил их туда для ясности). Я хочу сопоставить каждый файл, который заканчивается на .exe (не .exe c). Изначально мое регулярное выражение было:

my_reg = re.compile(".+[.](?=exe$)")
my_matches = my_reg.finditer(my_txt)

Я надеялся, что он сначала найдет каждый символ, go назад, пока не найдет ., а затем проверит, следуют ли символы exe и новая строка. Было найдено только одно совпадение: abab.exe. Я попытался немного повозиться и изменил первую строчку: my_reg = re.compile(".+[.](?=exe$)",flags=re.MULTILINE). На этот раз он успешно запустился, вернув

foo.
abab.

. Я думал, что re.MULTILINE не должен мешать оператору $, или я ошибаюсь насчет оператора $ / неправильного использования чего-то? Заранее спасибо!

1 Ответ

1 голос
/ 14 июля 2020

Вам нужен многострочный флаг, иначе $ будет соответствовать только абсолютному концу вашего ввода. Вам просто нужно сопоставить exe вместо использования lookahead:

my_reg = re.compile(".+[.]exe$", re.MULTILINE)

Вывод:

['foo.exe', 'abab.exe']

Demo

Если вы пытаясь сопоставить имя файла без расширения, вы можете поместить точку внутри просмотра вперед:

my_reg = re.compile(r".+(?=\.exe$)", re.MULTILINE)

Вывод:

['foo', 'abab']

Demo

...