Python从字符串电子邮件消息线程中分离对话

时间:2017-07-19 07:36:52

标签: python email

我想将回复和转发从电子邮件的线索分成对话。

一个例子是这样的:

2013年7月31日下午5:15,John Doe写道:

> example email text
>
>
> *From:* Me [mailto:me@gmail.com]
> *Sent:* Thursday, May 31, 2012 3:54 PM
> *To:* John Doe
> *Subject:* RE: subject
>
> example email text
>
>> Dear David,
>> 
>> Greetings from Doha!
>> Kindly enlighten me. I am confused.
>> 
>> With regards,
>> Smith
>>
>>> Dear Smith,
>>>
>>> Happy New year!
>>> Love
>>>
>>>> Dear Mr Wong,
>>>> Greetings!
>>>> Yours,
>>>> O

上面的例子是纯粹的,但格式是真的。有些电子邮件包含多个对话。

我已尝试https://github.com/zapier/email-reply-parser和其他软件包,但不幸的是,由于性能不稳定,它们无法投入生产。

模式非常清楚,可以通过计算“>”的数量来分隔对话。我最初的想法是浏览整个文档,找出有多少“>”在那里,然后提取每个“>” “>>” 中“>>>” 中和“>>>>”作为每次谈话。

我想知道那里有更好的方法吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

这是一个非常简单的解决方案itertools.groupby,假设电子邮件正文不包含'>'

In [165]: for _, v in itertools.groupby(text.splitlines(), key=lambda x: x.count('>')):
     ...:     print('\n'.join(v))
     ...:     print('-' * 20)
     ...:     

groupby为你计算。您需要key=lambda x: len(re.match(r'\>+', x).group(0))的内容来获得更全面的解决方案。

输出:

> example email text
>
>
> *From:* Me [mailto:me@gmail.com]
> *Sent:* Thursday, May 31, 2012 3:54 PM
> *To:* John Doe
> *Subject:* RE: subject
>
> example email text
>
--------------------
>> Dear David,
>> 
>> Greetings from Doha!
>> Kindly enlighten me. I am confused.
>> 
>> With regards,
>> Smith
>>
--------------------
>>> Dear Smith,
>>>
>>> Happy New year!
>>> Love
>>>
--------------------
>>>> Dear Mr Wong,
>>>> Greetings!
>>>> Yours,
>>>> O
--------------------