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

3
我有一个脚本用于解析电子邮件头中表示日期和时间的字段。以下是一些示例字符串:
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个回答

7

来自Python计算年龄的第二部分,时区

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)

我看到旧的rfc822模块有类似的功能,但我不知道email.utils。谢谢。 - ajt

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接