【发布时间】:2017-09-20 14:54:11
【问题描述】:
我尝试了许多正则表达式代码来从具有这种格式的电子邮件中提取日期,但我不能:
Date: Tue, 13 Nov 2001 08:41:49 -0800 (PST)
Sent: Thursday, November 08, 2001 10:25 AM
这是所有电子邮件中的样子,我想将它们都提取出来。
提前谢谢你
【问题讨论】:
-
你尝试了什么,什么没用?
我尝试了许多正则表达式代码来从具有这种格式的电子邮件中提取日期,但我不能:
Date: Tue, 13 Nov 2001 08:41:49 -0800 (PST)
Sent: Thursday, November 08, 2001 10:25 AM
这是所有电子邮件中的样子,我想将它们都提取出来。
提前谢谢你
【问题讨论】:
你可以用这种模式做这样的事情:
使用 Python3:
import re
data = "Date: Tue, 13 Nov 2001 08:41:49 -0800 (PST)"
final = re.findall(r"Date: (\w+), ([0-9]+) (\w+) ([0-9]+)", data)
print("{0}, {1}".format(final[0][0], " ".join(final[0][1:])))
print(" ".join(final[0][1:]))
使用 Python2:
import re
data = "Date: Tue, 13 Nov 2001 08:41:49 -0800 (PST)"
final = re.findall(r"Date: (\w+), ([0-9]+) (\w+) ([0-9]+)", data)
print "%s, %s" % (final[0][0], " ".join(final[0][1:]))
print " ".join(final[0][1:])
输出:
Tue, 13 Nov 2001
13 Nov 2001
编辑:
快速回答您的问题的新更新,您可以这样做:
import re
email = '''Date: Tue, 13 Nov 2001 08:41:49 -0800 (PST)
Sent: Thursday, November 08, 2001 10:25 AM'''
data = email.split("\n")
pattern = r"(\w+: \w+, [0-9]+ \w+ [0-9]+)|(\w+: \w+, \w+ [0-9]+, [0-9]+)"
final = []
for k in data:
final += re.findall(pattern, k)
final = [j.split(":") for k in final for j in k if j != '']
# Python3
print(final)
# Python2
# print final
输出:
[['Date', ' Tue, 13 Nov 2001'], ['Sent', ' Thursday, November 08, 2001']]
【讨论】:
如果只提取相同的字符串模型,您可以使用split(),而不是使用正则表达式:
email_date = "Date: Tue, 13 Nov 2001 08:41:49 -0800 (PST)"
email_date = '%s %s %s %s' % (tuple(email_date.split(' ')[1:5]))
输出:
Tue, 13 Nov 2001
【讨论】:
我不是正则表达式专家,但这里有一个解决方案,您可以为此编写一些测试
d = "Date: Tue, 13 Nov 2001 08:41:49 -0800 (PST)"
dates = [re.search('(\d+ \w+ \d+)',date).groups()[0] for date in re.search('(Date: \w+, \d+ \w+ \d+)', d).groups()]
['2001 年 11 月 13 日']
【讨论】:
import re
my_email = 'Date: Tue, 13 Nov 2001 08:41:49 -0800 (PST)'
match = re.search(r': (\w{3,3}, \d{2,2} \w{3,3} \d{4,4})', my_email)
print(match.group(1))
【讨论】: