Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析邮递员档案_Python_Regex - Fatal编程技术网

Python 解析邮递员档案

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

我目前正在尝试解析一个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: 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