某些文本中日期的python正则表达式

时间:2010-05-05 01:26:49

标签: python regex

如何通过python从文本文件中找到尽可能多的日期模式?日期模式定义为:

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

其中:

  • dd 是两位数字
  • mmm 是三个字符的英文月份名称(例如1月,3月,12月)
  • yyyy 是四位数年份
  • 有两个空格作为分隔符

谢谢!

5 个答案:

答案 0 :(得分:10)

这是一种查找与您的模式匹配的所有日期的方法

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

但是在WilhelmTell评论你的问题之后,我也想知道这是不是你真正要求的......

答案 1 :(得分:5)

使用日历模块为您提供一点全局意识:

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

对我来说,这会创建一个date_expr,如:

"\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}"

现在我的剧本也会为我的高卢朋友而战,但实际上很麻烦。

(您可能想知道为什么我必须从[1:]切片month_abbr列表 - 此列表以位置0中的空字符串开头,因此如果您使用find()查找特定月份缩写,您将从1-12回来,而不是从0-11回来。)

- 保罗

答案 2 :(得分:4)

这是一个稍微完整的例子。正则表达式将匹配的不仅仅是有效的日期值。 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
...

我想如果你这么倾向,可以把它折叠成一个很好的紧密代码和理解。

答案 3 :(得分:0)

试试这个:

import re

allmatches = re.findall(r'\d\d \w\w\w \d\d\d\d', "string to match")

答案 4 :(得分:0)

或者您可以完全使用它

date = re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}\s\d{2}:\d{2}', text)
print date
['30 November 2010 14:20', '30 November 2010 14:24']