Это находит все даты в вашем примере предложения:
for match in re.finditer(
r"""(?ix) # case-insensitive, verbose regex
\b # match a word boundary
(?: # match the following three times:
(?: # either
\d+ # a number,
(?:\.|st|nd|rd|th)* # followed by a dot, st, nd, rd, or th (optional)
| # or a month name
(?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)
)
[\s./-]* # followed by a date separator or whitespace (optional)
){3} # do this three times
\b # and end at a word boundary.""",
subject):
# match start: match.start()
# match end (exclusive): match.end()
# matched text: match.group()
Это определенно не идеально и может пропустить некоторые даты (особенно, если они не на английском языке - 21. Mai 2006
потерпит неудачу, а также4ème décembre 1999
), и соответствовать ерунде, как August Augst Aug
, но поскольку в ваших примерах почти все не является обязательным, вы не можете многое сделать на уровне регулярных выражений.
Следующим шагом будет кормить всехсовпадения в синтаксический анализатор и посмотреть, может ли он проанализировать их в разумную дату.
Регулярное выражение не может правильно интерпретировать контекст.Представьте себе (глупый) текст, такой как You'll find it in box 21. August 3rd will be the shipping date.
Он будет соответствовать 21. August 3rd
, который, конечно, не может быть проанализирован.