Python - 搜索字符串,复制直到文档结束
我正在使用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]