2014-04-07 55 views
1

好吧我有我需要提取“From”,“To”,“CC”,“Subject”和“Date”字段的电子邮件文本文件并将它们写入CSV按以下格式:Python正则表达式向前看后面

Date Subject From To CC 

的文件是与此类似:

From: "John Smith" <[email protected]> 
To: <[email protected]>, <[email protected]>, 
<[email protected]>, <[email protected]>, 
<[email protected]>, <[email protected]>, <[email protected]>, 
<[email protected]> 
CC: 
Subject: Test Email Extraction 
Date: Sun, 6 Apr 2014 19:30:55 -0400 
----------------- 
Testing Email extraction. 

,我遇到的问题是,“TO”和“CC”线几乎总是有许多条目占用多行。

我认为解决这个提取信息,以投入CSV是使用正则表达式,但我有没有运气可言......

即使不是越来越近。

有什么建议吗?

+1

你可以发布你目前拥有的代码吗?使你更容易帮助你! –

+0

你想保留所有来源地址,还是只保留第一个/最后一个?另外,请提供一个或两个预期的CSV格式示例,因为提供的行只是标题列表,并且没有逗号(它实际上是空间划分的,而不是逗号划定的?)。 –

回答

0

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

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

你可以做这样的事情:

In [1]: data = ''' 
    ...: From: "John Smith" <[email protected]> 
    ...: To: <[email protected]>, <[email protected]>, 
    ...: <[email protected]>, <[email protected]>, 
    ...: <[email protected]>, <[email protected]>, <[email protected]>, 
    ...: <[email protected]> 
    ...: 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" <[email protected]>', 
'To: <[email protected]>, <[email protected]>,\n<[email protected]>, <[email protected]>,\n<[email protected]>, <[email protected]>, <[email protected]>,\n<[email protected]>', 
'CC:', 
'Subject: Test Email Extraction', 
'Date: Sun, 6 Apr 2014 19:30:55 -0400\n-----------------\nTesting Email extraction.'] 

你有data列表中的结果。使用csv模块和\t作为分隔符,并以所需格式写出标题和数据。当然,在那里有\n,但是在写入文件之前,您可以通过遍历列表中的项目去除这些项目。

希望这会有所帮助。