如何通过python从文本文件中找到尽可能多的日期模式?日期模式定义为:
dd mmm yyyy
^ ^
| |
+---+--- spaces
其中:
谢谢!
答案 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']