Python正则表达式展望未来

时间:2014-04-07 00:52:44

标签: python regex lookahead lookbehind

好的,我有电子邮件的文本文件,我需要提取"从","到"," CC",&#34受试者#34;和"日期"字段并按以下格式将它们写入CSV:

Date    Subject    From    To    CC

文件类似于:

From: "John Smith" <jsmith@jsmith.com>
To: <john.doe.1@gmail.com>, <john.doe.2@gmail.com>,
<john.doe.3@gmail.com>, <john.doe.4@gmail.com>,
<john.doe.6@yahoo.com>, <john.doe.5@gmail.com>, <jdoe@live.com>,
<j.doe.5@live.com>
CC: 
Subject: Test Email Extraction
Date: Sun, 6 Apr 2014 19:30:55 -0400
-----------------
Testing Email extraction.

我遇到的问题是&#34; TO&#34;和&#34; CC&#34;行几乎总是有许多条目占用多行。

我认为提取此信息以放入CSV的解决方案是使用REGEX,但我根本没有运气......

甚至没有接近。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我可以使用python的re.S标志使用下面的正则表达式来获取您想要的数据。

r'(From:.*).*(To:.*).*(CC:.*).*(Subject:.*).*(Date:.*)'

你可以这样做:

In [1]: data = '''
   ...: From: "John Smith" <jsmith@jsmith.com>
   ...: To: <john.doe.1@gmail.com>, <john.doe.2@gmail.com>,
   ...: <john.doe.3@gmail.com>, <john.doe.4@gmail.com>,
   ...: <john.doe.6@yahoo.com>, <john.doe.5@gmail.com>, <jdoe@live.com>,
   ...: <j.doe.5@live.com>
   ...: CC:
   ...: Subject: Test Email Extraction
   ...: Date: Sun, 6 Apr 2014 19:30:55 -0400
   ...: -----------------
   ...: Testing Email extraction.
   ...: '''
In [2]: import re
In [3]: results = re.findall(r'(From:.*).*(To:.*).*(CC:.*).*(Subject:.*).*(Date:.*)', data, re.S)
In [4]: headers = ['From', 'To', 'CC', 'Subject', 'Date']
In [6]: data = [item.strip() for item in results[0]]
In [7]: data
Out[7]:
['From: "John Smith" <jsmith@jsmith.com>',
 'To: <john.doe.1@gmail.com>, <john.doe.2@gmail.com>,\n<john.doe.3@gmail.com>, <john.doe.4@gmail.com>,\n<john.doe.6@yahoo.com>, <john.doe.5@gmail.com>, <jdoe@live.com>,\n<j.doe.5@live.com>',
 'CC:',
 'Subject: Test Email Extraction',
 'Date: Sun, 6 Apr 2014 19:30:55 -0400\n-----------------\nTesting Email extraction.']

您的结果位于data列表中。使用带有csv的{​​{1}}模块作为分隔符,并以所需格式写出标题和数据。当然,那里有\t个,但你可以在写入文件之前遍历列表中的项目来删除它们。

希望这有帮助。