Я пытаюсь зафиксировать даты, которые могут быть в такой строке
'30 jan and 6 apr and 12 oct 2022'
Я использую модуль регулярного выражения python (он такой же, как re, но имеет опцию «перекрытия»). Мне нужно получить конечный результат в виде этого списка
['30 jan 2022', '6 apr 2022', '12 oct 2022']
пока с этим выражением
regex.findall(r'(?:\d\d | \d )(?:jan|feb|mar|ap|may|jun|jul|aug|sep|oct|nov|dec)(?:.*)20(?:\d\d)', d, overlapped=True)
я получаю
['30 jan and 6 apr and 12 oct 2022', ' 6 apr and 12 oct 2022', '12 oct 2022']
Заранее спасибо.
Вы можете использовать понимание списка и 2 группы захвата:
\b(\d+ (?:jan|feb|mar|ap|may|jun|jul|aug|sep|oct|nov|dec))(?=.*\b(20\d\d))\b
См. демонстрация регулярных выражений и демонстрация Python.
import re
pattern = r"\b(\d+ (?:jan|feb|mar|ap|may|jun|jul|aug|sep|oct|nov|dec))(?=.*\b(20\d\d))\b"
s = r"30 jan and 6 apr and 12 oct 2022"
res = [' '.join(s) for s in re.findall(pattern, s)]
print(res)
Выход
['30 jan 2022', '6 ap 2022', '12 oct 2022']
Обратите внимание, что (?:.*)
и (?:\d\d)
не нужна группа без захвата, так как группа сама по себе не имеет смысла в шаблоне.
@Sev Вы не можете пропустить .*
в скороговорке, так как прогноз указывает год, который не следует непосредственно за названиями месяцев. .*
в шаблоне на самом деле ничего не соответствует, это часть не потребляющего просмотра вперед, который сам по себе имеет группу захвата, которая принимает участие в окончательном выводе.
Это работает спасибо! Я просто блуждал (и, может быть, вы тоже это знаете), есть ли способ просто пропустить часть
.*
после месяца? В случае30 jan and 6 apr and 12 oct 2022
, когда он соответствуетjan
илиapr
, просто игнорировать все до 2022 года.