文本中日期的Python正则表达式

4 投票
5 回答
36758 浏览
提问于 2025-04-15 22:21

我想知道怎么用Python从一个文本文件中找到尽可能多的日期格式。日期格式的定义是:

dd mmm yyyy
  ^   ^
  |   |
  +---+--- spaces

其中:

  • dd 是一个两位数的数字
  • mmm 是三字符的英文月份名称(比如 Jan、Mar、Dec)
  • yyyy 是一个四位数的年份
  • 日期之间有两个空格作为分隔符

谢谢!

5 个回答

5

这里有一个稍微完整一点的例子。这个正则表达式不仅仅会匹配有效的日期值。datetime.strptime 方法会对任何无效的日期解析失败,并抛出一个 ValueError 错误。如果日期成功解析,那么你就得到了一个完整的 datetime 对象,这个对象可以让你使用很多功能。

>>> from datetime import datetime
>>> import re
>>> dates = []
>>> patn = re.compile(r'\d{2} \w{3} \d{4}')
>>> fh = open('inputfile')
>>> for line in fh:
...   for match in patn.findall(line):
...     try:
...       val = datetime.strptime(match, '%d %b %Y')
...       dates.append(val)
...     except ValueError:
...       pass # ignore, this isn't a date
...

我想,如果你愿意的话,这些代码可以用更简洁的方式来写,使用列表推导式等技巧。

9

使用日历模块可以让你对全球的日期有更好的了解:

date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(calendar.month_abbr[1:])
print date_expr
print re.findall(date_expr, source_text)

对我来说,这样会生成一个日期表达式,像这样:

"\d{2} (:?Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}"

但是如果我使用区域设置模块来改变我的地区设置:

locale.setlocale(0, "fr")

现在我可以用法语来查找月份:

"\d{2} (?:janv.|févr.|mars|avr.|mai|juin|juil.|août|sept.|oct.|nov.|déc.) \d{4}"

嗯,这是我第一次尝试法语的月份缩写,可能需要做一些整理:

date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(
    m.title().rstrip('.') for m in calendar.month_abbr[1:])

现在我得到了:

"\d{2} (?:Janv|Févr|Mars|Avr|Mai|Juin|Juil|Août|Sept|Oct|Nov|Déc) \d{4}"

这样我的脚本也可以顺利运行在我的法语朋友那边,几乎没有什么麻烦。

(你可能会好奇为什么我需要从 month_abbr 列表中切片 [1:] - 这个列表的第一个位置是一个空字符串,所以如果你用 find() 查找某个特定的月份缩写,你会得到一个从 1 到 12 的数字,而不是从 0 到 11。)

-- 保罗

11

这里有一种方法可以找到所有符合你模式的日期

re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}', text)

不过在WilhelmTell对你问题的评论之后,我也在想这是不是你真正想问的...

撰写回答