Python - 搜索字符串,复制到doc结束

时间:2011-12-13 21:49:40

标签: python regex

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

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

print emllist[37:]

但是,标题的最后一行的开头始终相同,并以X-OriginalArrivalTime开头。

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

我一直在重读python re文档,但我似乎无法想出一个很好的方法来攻击它。

非常感谢任何帮助

感谢

5 个答案:

答案 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'