如何通过python从文本文件中找到尽可能多的日期模式?日期模式定义为:
dd mmm yyyy
^ ^
| |
+---+--- spaces
Run Code Online (Sandbox Code Playgroud)
哪里:
谢谢!
Dav*_*d Z 10
这是一种查找与您的模式匹配的所有日期的方法
re.findall(r'\d\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{4}', text)
Run Code Online (Sandbox Code Playgroud)
但是在WilhelmTell评论你的问题之后,我也想知道这是不是你真正要求的......
使用日历模块为您提供一点全局意识:
date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(calendar.month_abbr[1:])
print date_expr
print re.findall(date_expr, source_text)
Run Code Online (Sandbox Code Playgroud)
对我来说,这会创建一个date_expr,如:
"\d{2} (:?Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4}"
Run Code Online (Sandbox Code Playgroud)
但是如果我使用locale模块更改我的语言环境:
locale.setlocale(0, "fr")
Run Code Online (Sandbox Code Playgroud)
我现在用法语搜索几个月:
"\d{2} (?:janv.|févr.|mars|avr.|mai|juin|juil.|août|sept.|oct.|nov.|déc.) \d{4}"
Run Code Online (Sandbox Code Playgroud)
嗯,这是我第一次尝试法语月缩写,我可能需要做一些清理:
date_expr = r"\d{2} (?:%s) \d{4}" % '|'.join(
m.title().rstrip('.') for m in calendar.month_abbr[1:])
Run Code Online (Sandbox Code Playgroud)
现在我得到:
"\d{2} (?:Janv|Févr|Mars|Avr|Mai|Juin|Juil|Août|Sept|Oct|Nov|Déc) \d{4}"
Run Code Online (Sandbox Code Playgroud)
而且现在我的剧本也会为我的高卢朋友而战,真的很麻烦.
(您可能想知道为什么我必须从[1:]切片month_abbr列表 - 此列表以位置0中的空字符串开头,因此如果您使用find()查找特定月份缩写,您将返回数字来自1-12,而不是0-11.)
- 保罗
这是一个稍微完整的示例。正则表达式将匹配的不仅是有效的日期值。 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
...
Run Code Online (Sandbox Code Playgroud)
我想如果您愿意的话,可以将其折叠成不错的紧致代码。
| 归档时间: |
|
| 查看次数: |
24934 次 |
| 最近记录: |