在python中从字符串中提取日期时间的最佳方法

时间:2011-06-10 13:42:15

标签: python regex datetime

我有一个脚本解析了表示日期和时间的电子邮件标题中的字段。这些字符串的一些示例如下:

Fri, 10 Jun 2011 11:04:17 +0200 (CEST)
Tue, 1 Jun 2011 11:04:17 +0200
Wed, 8 Jul 1992 4:23:11 -0200
Wed, 8 Jul 1992 4:23:11 -0200 EST

在我遇到某些字符串末尾的CEST / EST部分之前,我使用datetime.datetime.strptime这样的事情做得非常好:

msg['date'] = 'Wed, 8 Jul 1992 4:23:11 -0200'
mail_date = datetime.datetime.strptime(msg['date'][:-6], '%a, %d %b %Y %H:%M:%S')

我试图将正则表达式放在一起以匹配字符串的日期部分,同时在最后排除时区信息,但我遇到了正则表达式的问题(我无法匹配冒号)。

使用正则表达式是解析上述所有示例的最佳方法吗?如果是这样,有人可以共享一个与这些例子匹配的正则表达式吗?最后,我希望有一个日期时间对象。

2 个答案:

答案 0 :(得分:7)

来自python time to age part 2, timezones

from email import utils
utils.parsedate_tz('Fri, 10 Jun 2011 11:04:17 +0200 (CEST)') 
utils.parsedate_tz('Fri, 10 Jun 2011 11:04:17 +0200')
utils.parsedate_tz('Fri, 10 Jun 2011 11:04:17')

输出结果为:

(2011, 6, 10, 11, 4, 17, 0, 1, -1, 7200)
(2011, 6, 10, 11, 4, 17, 0, 1, -1, 7200)
(2011, 6, 10, 11, 4, 17, 0, 1, -1, None)

答案 1 :(得分:2)

也许我误解了你的问题,但是不够简单split就足够了吗?

#!/usr/bin/python

d = ["Fri, 10 Jun 2011 11:04:17 +0200 (CEST)", "Tue, 1 Jun 2011 11:04:17 +0200", 
     "Wed, 8 Jul 1992 4:23:11 -0200", "Wed, 8 Jul 1992 4:23:11 -0200 EST"]

for i in d:
    print " ".join(i.split()[0:5])


Fri, 10 Jun 2011 11:04:17
Tue, 1 Jun 2011 11:04:17
Wed, 8 Jul 1992 4:23:11
Wed, 8 Jul 1992 4:23:11