2013-10-23 33 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'來測試這兩者,它們效率幾乎相同,所以我認爲你的正則表達式在大多數情況下會更好,因爲它更具可讀性。 –