Python 解析邮递员档案
我目前正在尝试解析一个Mailman txt存档文件。这些文件将所有通过列表发送的电子邮件连接在一个文件中。结构如下:Python 解析邮递员档案,python,regex,Python,Regex,我目前正在尝试解析一个Mailman txt存档文件。这些文件将所有通过列表发送的电子邮件连接在一个文件中。结构如下: From SOMETHING From: SOMETHING Date: SOMETHING Subject: SOMETHING In-Reply-To: SOMETHING Message-ID: <SOMETHING> CONTENT From SOMETHING From: SOMETHING Date: SOMETHING Subject: SOM
From SOMETHING
From: SOMETHING
Date: SOMETHING
Subject: SOMETHING
In-Reply-To: SOMETHING
Message-ID: <SOMETHING>
CONTENT
From SOMETHING
From: SOMETHING
Date: SOMETHING
Subject: SOMETHING
In-Reply-To: SOMETHING
Message-ID: SOMETHING
CONTENT
[...]
但是
body
不包含消息的正文,只包含一个换行符。我如何使最后一个匹配组与所有匹配项匹配,但只要上述部分匹配,身体匹配组就不应该匹配?您有两个选项:
\n开头。这永远不会出现在消息正文中,因为From
字符串的前缀将是大于符号(
)。请注意,邮件标题(带冒号的行)由RFC-2822定义,不属于邮箱格式的一部分。我相信RFC没有为消息头指定任何特定的顺序
消息之间是否有明显的分隔符?例如
\n\n
或类似的?我对此不确定。我认为\n\n
总是在消息之间,但问题是它也可能在正文中。所以理论上,你可以有一封包含6行标题的电子邮件,对吗?我不知道是否有可靠的方法来解析这个…@谢普:哦,你说得对。。。好的,但我想说这是不太可能的(尽管有很多新行可能)。因此,它应该解析尽可能多的消息,并且整个归档应该是“匹配的”。因此,当我连接匹配的部分时,我应该能够恢复原始存档。一种方法是匹配我上面给出的正则表达式,搜索,获取消息id,在消息id行上方拆分6行。然后,您将拥有单个消息,并且可以非常轻松地解析其余的消息。
def parseContent(content):
import re
pattern = r"From (.*)\n"+\
"From: (.*)\n"+\
"Date: (.*)\n"+\
"Subject: (.*)\n"+\
"In-Reply-To: (.*)\n"+\
"Message-ID: (.*)\n"+\
"(.*)"
matches = re.findall(pattern, content)
for from1, from2, date, subject, inreply, messageid, body in matches:
print from1
print body
print "#"*20
return matches