Python - 搜索字符串,复制直到文档结束

0 投票
5 回答
1220 浏览
提问于 2025-04-17 08:20

我正在使用Python逐个打开EML文件,处理完后再把它们移动到另一个文件夹。EML文件里包含了一封电子邮件的内容,包括邮件头。

EML文件的前35到40行是邮件头信息,后面才是实际的邮件内容。由于邮件头的行数会有所不同,我不能简单地把EML文件转换成一个列表,然后告诉它:

print emllist[37:]

不过,邮件头最后一行的开头总是相同的,都是以X-OriginalArrivalTime开头。

我的目标是解析EML文件,找到X-OriginalArrivalTime所在的行号,然后把EML文件分成两个部分,一个是邮件头信息,另一个是邮件内容。

我一直在重新阅读Python的正则表达式文档,但似乎找不到一个好的方法来解决这个问题。

任何帮助都非常感谢。

谢谢。

lou

5 个回答

0

在这段代码之后

match = re.search(r'(.*^X-OriginalArrivalTime[^\n]*\n+)(.*)$',
                  open('foo.eml').read(),
                  re.DOTALL | re.MULTILINE)

match.groups(1) 应该包含标题,而 match.groups(2) 则包含电子邮件内容的主体。这里的 re.DOTALL 这个标志的作用是让 . 也能匹配换行符。

1

这个re模块在计算行数方面不是特别好。而且,你可能也不需要它来检查一行的开头内容。下面这个函数接收一个EML文件的文件名作为输入,然后返回一个包含两个字符串的元组:一个是文件的头部信息,另一个是消息内容。

def process_eml(filename):
    with open(filename) as fp:
        lines = fp.readlines()

    for i, line in enumerate(lines):
        if line.startswith("X-OriginalArrivalTime"):
             break
    else:
        raise Exception("End of header not found")

    header = '\n'.join(lines[:i+1]) # Message starts at i + 1
    message = '\n'.join(lines[i+1:])

    return header, message
1

你可能不需要用到正则表达式。这样做怎么样:

msg = data.split('X-OriginalArrivalTime', 1)[1].split('\n', 1)[1]

撰写回答