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

Пытаюсь найти те предложения, в которых содержится название месяца как даты, которая может быть записано по-разному, например “апр”, “апрель(и все его склонения)”, “apr”, “april” и “04” (предложение в нижнем регистре). При этом в идеале нужно, чтобы предыдущий и последующий символ были только либо пробелом “ ”, либо точкой “.”, либо одинарной кавычкой “'”, либо их вообще не было. Нужно просто найти первое вхождение, а где оно, есть ли дальше другие - неважно.

Написал такое выражение: re.match(r'.*?(апр(?:ель|еля|елю|елем|еле)|apr(?:il)|04(?:\W)?)', sentence), но оно покрывает не все описанные выше случаи - к примеру, не срабатывает на "В апр 2020 задолженность" и ложно срабатывает на “У нашей заправки задолженность”, “апрельская задолженность” и на “044”.

Подскажите, как должно выглядеть правильное выражение, заранее спасибо)


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Используйте

re.search(r'\b(апр(?:ел(?:[ьяюе]|ем)?)?|apr(?:il)?|04)\b', sentence)

Подробности

  • \b - граница слова
  • ( - начало подмаски №1
    • апр - строка апр
    • (?:ел(?:[ьяюе]|ем)?)? - ел, после которого следует один или ноль (т.е. опционально) ь, я, ю, е или ем
  • | - или
    • apr - строка apr
    • (?:il)? - необязательная последовательности символов il
  • | - или
    • 04 - 04
  • ) - конец подмаски
  • \b - граница слова
→ Ссылка