Regex从email tex中提取日期和时间

2024-04-27 08:01:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件里面有大量的文本。有些看起来像这样:

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

我试了一下:

^{pr2}$

我得到的回报是几百:

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

Tags: orgsrcnewmanagesiterevtooljava
2条回答

两件事:

首先,正则表达式本身:

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是一个字符串:

^{pr2}$

^{} produces a compiled regular expression objectfindall是这个对象的几个方法之一,这些方法允许您进行实际的搜索/匹配/查找。在

最后:您当前使用的是命名捕获组。((?P<sep>[-/]))从你的问题“我只需要拉出遵循这种模式的日期”来看,你似乎并不需要这些。您需要提取整个表达式,而不是捕获“分隔符”,这正是捕获组的目的。在

完整代码块:

>>> 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)'))

相关问题 更多 >