2013-10-23 37 views
0

我有一个字符串中的很多电子邮件。我需要将此字符串拆分为单独的电子邮件。每封电子邮件均以新行开头“From:”。如果没有“从:”其他地方在身体那么下面的作品 -使用re.split()分割字符串

list_of_email_strings = re.split("From:", my_email_text_string) 

我需要尽管忽略“来源:”不会出现一个新行之后。以下(带有脱字符号)不起作用 -

list_of_email_strings = re.split("^From:", my_email_text_string) 

解决方法?

+0

为什么不在新行上拆分并放弃每个项目上的'From:'? – asermax

+0

你可能想保留'From:',不是? – StvnW

+2

你的电子邮件字符串是某种邮箱文件吗?如果是这样,你可以试试['mailbox'模块](http://docs.python.org/2/library/mailbox.html)。 – Blckknght

回答

0

我不明白你为什么需要这个正则表达式。如何简单的东西,如:

list_of_email_strings = my_email_text_string.split('\nFrom:') 
+0

我想在可能的情况下使用字符串builtins,但是这会去掉'From:',在这种情况下,人们可能会认为这不是这个意图。 – StvnW

1

您可以用具有不进食,导致您要拆分字符串的优势非消费前向断言(?=...)结合\n(例如“来源:”保持不变)。

list_of_email_strings = re.split("\n(?=From:)", my_email_text_string) 

如:

>>> s = "From: ...\nFrom: ...\nFrom: ..." 
>>> re.split("\n(?=From:)", s) 
['From:...', 'From:...', 'From:...'] 

相比于:

>>> re.split("\nFrom:", s) 
['From: ...', ' ...', ' ...'] 
+0

谢谢。奇迹般有效。我确实知道了\ n部分,但前瞻断言是一个很好的提示。 – gantiv

1

类似WIM的答案,但从:添加回为所需的电子邮件:

list = ['From:' + msg for msg in ('\n' + text).split('\nFrom:')] 

但是,本地Python模块它可以为您提供更精确,更可靠的电子邮件文件阅读功能,例如您所描述的文件。想起了emailmailbox

假设这些是标准的mbox风格的电子邮件,其中每个文件以“From:”开始,然后是一些标题行,可能是摘要等 - 就像sendmail或Postfix所使用的那样 - 如果您无论是第一次写入文件中的字符串或者只是利用现有的文件:

mbox = mailbox.mbox(path_to_mailbox_file) 
mbox.lock() # only if you're using an active mailbox file 
message_strings = [message.as_string() for message in mbox] 
mbox.unlock() # again, only if you're using an acture mailbox file 
mbox.close() 

要得到消息的数量,只需使用len(mbox)

还有很多其他有用的功能。我已经使用这些模块制作了一些脚本,并且对结果非常满意。 (请注意,as_string可能会重新格式化部分标题。)

+0

我同意推荐'mailbox'模块,但是像这样拆分和重新组装字符串就是kludgy。 – StvnW

+0

这很公平。我重写它使用更紧凑的列表理解,但你的正则表达式更加优雅恕我直言。我用'timeit'来测试这两者,它们效率几乎相同,所以我认为你的正则表达式在大多数情况下会更好,因为它更具可读性。 –