【问题标题】:Python regex look ahead look behind [closed]Python正则表达式向前看向后[关闭]
【发布时间】:2014-04-07 00:52:44
【问题描述】:

好的,我有电子邮件的文本文件,我需要提取“发件人”、“收件人”、“抄送”、“主题”和“日期”字段并将它们以下列格式写入 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.

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

我认为提取此信息以放入 CSV 的解决方案是使用正则表达式,但我完全没有运气......

甚至没有靠近。

有什么建议吗?

【问题讨论】:

  • 你能发布你目前拥有的代码吗?帮助您更轻松!
  • 您想保留所有的 from 和 to 地址,还是只保留第一个/最后一个?另外,请给出预期 CSV 格式的一两行示例,因为所提供的行只是标题列表,并且没有逗号(实际上是空格分隔,而不是逗号分隔?。

标签: python regex lookahead lookbehind


【解决方案1】:

我可以通过使用下面的正则表达式和 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 模块和\t 作为分隔符,并以您想要的格式写出标题和数据。当然里面有\ns,但是你可以通过在写入文件之前遍历列表中的项目来删除它们。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多