我正在使用python一次打开一个EML文件,处理它们然后将它们移动到另一个文件夹。 EML文件包含包含标题的电子邮件。
EML的前35-40行是标题信息,后跟实际的电子邮件消息。由于标题的行数发生了变化,我无法将我的EML文件转换为列表并告诉它:
print emllist[37:]
但是,标题的最后一行的开头始终相同,并以X-OriginalArrivalTime开头。
我的目标是解析我的EML文件,搜索行号X-OriginalArrivalTime,然后将EML分成2个字符串,一个包含标题信息,另一个包含消息。
我一直在重读python re文档,但我似乎无法想出一个很好的方法来攻击它。
非常感谢任何帮助
感谢
娄
答案 0 :(得分:1)
你可以避免使用正则表达式。怎么样:
msg = data.split('X-OriginalArrivalTime', 1)[1].split('\n', 1)[1]
答案 1 :(得分: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
答案 2 :(得分: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
标记会导致.
与换行符匹配。
答案 3 :(得分:0)
我不确定它是否适用于eml文件,但是python has a module可以处理电子邮件文件。
如果这不起作用,是否从带有空行的消息中拆分标题?
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:]
答案 4 :(得分:0)
这是正确的,避免正则表达式会很有趣,但是现在,因为你想将标题和消息分配到两个不同的字符串中,我认为 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'