Python 正则表达式从电子邮件文本中提取日期和时间

Python 正则表达式从电子邮件文本中提取日期和时间,python,regex,Python,Regex,我有一个文件,里面有很多文本。有些看起来像这样: X-DSPAM-Processed: Fri Jan 4 18:10:48 2008 X-DSPAM-Confidence: 0.6178 X-DSPAM-Probability: 0.0000 Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39771 Author: louis@media.berkeley.edu Date: 2008-01-04 18

我有一个文件,里面有很多文本。有些看起来像这样:

X-DSPAM-Processed: Fri Jan  4 18:10:48 2008
X-DSPAM-Confidence: 0.6178
X-DSPAM-Probability: 0.0000

Details: http://source.sakaiproject.org/viewsvn/?view=rev&rev=39771

Author: louis@media.berkeley.edu
Date: 2008-01-04 18:08:50 -0500 (Fri, 04 Jan 2008)
New Revision: 39771

Modified:
bspace/site-manage/sakai_2-4-x/site-manage-tool/tool/src/bundle/sitesetupgeneric.properties
bspace/site-manage/sakai_2-4-x/site-manage-tool/tool/src/java/org/sakaiproject/site/tool/SiteAction.java
Log:
BSP-1415 New (Guest) user Notification
我只需要找出遵循以下模式的日期:

2008-01-04 18:08:50-0500

以下是我尝试过的:

import re

text = open('mbox-short.txt')
for line in text:
    dates = re.compile('\d{4}(?P<sep>[-/])\d{2}(?P=sep)\d{2}\s\d{2}:\d{2}:]\d{2}\s[-/]\d{4}')
    print(dates)

text.close()
重新导入
text=open('mbox-short.txt')
对于文本中的行:
dates=re.compile('\d{4}(?P[-/])\d{2}(?P=sep)\d{2}\s\d{2}:\d{2}:][\d{2}\s[-/]\d{4})
打印(日期)
text.close()
我得到的回报是数百:

\d{4}(?P<sep>[-/])\d{2}(?P=sep)\d{2}\s\d{2}:\d{2}:]\d{2}\s[-/]\d{4}
\d{4}(?P[-/])\d{2}(?P=sep)\d{2}\s\d{2}:\d{2}:]\d{2}\s[-/]\d{4}
两件事:

首先,正则表达式本身:

regex = re.compile(r'\b\d{4}[-/]\d{2}[-/]\d{2}\s\d{2}:\d{2}:\d{2}\s[-+]\d{4}\b')
其次,您需要调用
regex.findall(file)
,其中
file
是一个字符串:

>>> regex.findall(file)
['2008-01-04 18:08:50 -0500']
findall
是此对象的几种方法之一,可用于执行实际搜索/匹配/查找

最后:您当前正在使用命名捕获组。(
(?P[-/])
)从您的问题中,“我只需要找出遵循此模式的日期”,您似乎不需要这些。您希望提取整个表达式,而不是捕获“分隔符”,这正是捕获组的设计目的

完整代码块:

>>> import re
>>> regex = re.compile(r'\b\d{4}[-/]\d{2}[-/]\d{2}\s\d{2}:\d{2}:\d{2}\s[-+]\d{4}\b')
>>> with open('mbox-short.txt') as f:
...     print(regex.findall(f.read()))
...     
['2008-01-04 18:08:50 -0500']

这是另一个解决方案

import re
numberExtractRegex = re.compile(r'(\d\d\d\d[-]\d\d[-]\d\d\s\d\d[:]\d\d[:]\d\d\s[-]\d\d\d\d)')
print(numberExtractRegex.findall('Date: 2008-01-04 18:08:50 -0500 (Fri, 04 Jan 2008), Date: 2010-01-04 18:08:50 -0500 (Fri, 04 Jan 2010)'))

re.compile-only编译模式,以搜索使用日期。搜索(行)似乎不起作用,或者我不确定要替换什么。我是一名编程初学者,参加了一个Python课程,他们不教我们,他们只是让我们“做”。我需要的输出只是列表中的日期字符串。@ArchivistG。是否所有此类日期都显示在以“日期:”开头的行上?因为如果他们这样做了,就根本不需要使用regexp:简单的字符串操作就足够了。@ArchivistG。事实上,更好的解决方案是使用模块,它可以解析mbox文件。试图重新发明轮子是没有意义的。完成了。在不询问其他正式问题的情况下,如何打印结果,同时将结果存储到列表中以供以后使用?当然——如果您只想将其存储在同一个Python会话中使用,只需使用
my_variable=regex.findall(f.read())
,因为
findall()
返回一个列表。要在另一个会话中访问它,请查看。允许在时区之前使用减号或斜线几乎肯定是错误的。您希望允许加号或减号<代码>[-+]。我知道你只是从OP的代码中复制了这一点,但由于这是现在公认的答案,它可能也会纠正这个错误。RFC5322定义了
日期:
标题格式和一些标准标题。单凭单一部分本身不值得否决,但是这个正则表达式只允许时区中的负UTC偏移。在不需要字符类的地方使用字符类也应该劝阻任何人不要相信这是应该的。