我正在研究这个问题,并试图解决同样的问题。我必须提取插入到 txt 文件中的所有数据。到目前为止,我已经达到以下(几乎不可读)模式
import re
pattern = r'(?<![A-Za-z0-9-\./])\b(?:\d{1,2}[-/th|st|nd|rd\s.])?(?:(?:Jan|January|Feb|February|Mar|March|Apr|April|May|Jun|June|Jul|July|August|Sep|September|Oct|October|Nov|November|Dec|December)[\s,.]*)?(?:(?:\d{1,2})[-/th|st|nd|rd\s,.]*)?(?:\d{2,4})\b(?![A-Za-z0-9-/])'
dates = df.apply(lambda row: [match for match in re.findall(pattern, row)])
但是除了我的文本文件之外,还有一些数字被捕获,例如 29505 会被正则表达式捕获,但我未能成功修复它,因此不考虑 2、3、5 或更多位数。关于我能做什么的任何提示?将它们放在后置过滤器上是否更容易?
正如您所提到的,“几乎可读的模式”可以变得可读 通过使用
x
标志,让您可以使用注释和空格。
然后我会提出一些改变/改进:
i
标志接受小写月份。我会想出这个模式:
\b(?<![-./]) # Don't match if the number is preceded by '-', '.' or '/'
# Group 1: Day number, only between 1 and 31, with optional 0 prefix.
(0?[1-9]|[12]\d|3[0-1])
(?:th|st|[nr]d)? # Optional st, th, rd, nd
\s+ # space(s) before month.
# Group 2: Month.
(Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|
June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|
Nov(?:ember)?|Dec(?:ember)?)
\.?\s+ # Optional dot for month abbreviation and space(s).
# Group 3: Year.
(\d{2}(?:\d{2})?)
(?![-/]?\d) # The year should not be followed by '-', '/' and digits.
在这里进行现场测试:https://regex101.com/r/TmhiNQ/1
并在Python中运行它:https://www.programiz.com/online-compiler/9Vr7225izGRPx