Python-搜索字符串,复制到文档末尾

Python-搜索字符串,复制到文档末尾,python,regex,Python,Regex,我使用python一次打开一个EML文件,处理它们,然后将它们移动到另一个文件夹。EML文件包含包含标题的电子邮件消息 EML的前35-40行是标题信息,后面是实际的电子邮件消息。由于页眉的行数发生变化,我不能将我的EML文件转换为列表并告诉它: print emllist[37:] 但是,标题最后一行的开头始终相同,并且以X-OriginalArrivalTime开始 我的目标是解析我的EML文件,搜索行号X-OriginalArrivalTime为on,然后将EML拆分为两个字符串,一个包

我使用python一次打开一个EML文件,处理它们,然后将它们移动到另一个文件夹。EML文件包含包含标题的电子邮件消息

EML的前35-40行是标题信息,后面是实际的电子邮件消息。由于页眉的行数发生变化,我不能将我的EML文件转换为列表并告诉它:

print emllist[37:]
但是,标题最后一行的开头始终相同,并且以X-OriginalArrivalTime开始

我的目标是解析我的EML文件,搜索行号X-OriginalArrivalTime为on,然后将EML拆分为两个字符串,一个包含标题信息,一个包含消息

我一直在重新阅读pythonre文档,但似乎找不到一个好方法来解决这个问题

非常感谢您的帮助

谢谢


lou

您可能可以避免使用正则表达式。那么:

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


match.groups(1)
应包含邮件标题和
match.groups(2)
邮件正文。该标志导致
匹配换行符。

模块
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

我不确定它是否能与eml文件一起工作,但python不能与电子邮件文件一起工作

若这不起作用,那个么标题是否会从消息中以空行分隔开呢

lines = fp.readlines()
header_end = lines.index('\n') # first empty line, I think it is the end of header.
headers = lines[:header_end]
message = lines[header_end:]

没错,避免使用正则表达式是很有意思的,但目前,由于您希望将头和消息分派到两个不同的字符串中,我认为split(),它消除了进行拆分的顺序,以及partition(),它返回一个包含3个元素的元组,不适合该用途,因此正则表达式保持利息:

import re

regx = re.compile('(.+?X-OriginalArrivalTime\.[^\n]*[\r\n]+)'
                  '(.+)\Z',
                  re.DOTALL)

ss = ('blahblah blah\r\n'
      'totoro tootrototo \r\n'
      'erteruuty\r\n'
      'X-OriginalArrivalTime. 12h58 Huntington Point\r\n'
      'body begins here\r\n'
      'sdkjhqsdlfkghqdlfghqdfg\r\n'
      '23135468796786876544\r\n'
      'ldkshfqskdjf end of file\r\n')


header,message = regx.match(ss).groups()

print 'header :\n',repr(header)
print
print 'message :\n',repr(message)
结果

header :
'blahblah blah\r\ntotoro tootrototo \r\nerteruuty\r\nX-OriginalArrivalTime. 12h58 Huntington Point\r\n'

message :
'body begins here\r\nsdkjhqsdlfkghqdlfghqdfg\r\n23135468796786876544\r\nldkshfqskdjf end of file\r\n'

我尝试了lines=open('alarm.eml')。readlines()头=lines.index('\n)打印头,但它给了我35,而不是文本。。。我该怎么办?你在问题中展示了你知道如何拆分列表,所以我认为我不需要再次展示:)更新。现在,我该如何将上半部分放入字符串中?我还发现我可以使用str.partition()。。。非常感谢你!!当我在这之后运行print match.groups(1)时,我看到了整个消息,而不仅仅是标题。
header :
'blahblah blah\r\ntotoro tootrototo \r\nerteruuty\r\nX-OriginalArrivalTime. 12h58 Huntington Point\r\n'

message :
'body begins here\r\nsdkjhqsdlfkghqdlfghqdfg\r\n23135468796786876544\r\nldkshfqskdjf end of file\r\n'