2011-12-13 3 views
0

나는 한 번에 하나씩 EML 파일을 열어 파이썬을 사용하여 처리 한 다음 다른 폴더로 이동합니다. EML 파일에는 헤더가 포함 된 전자 메일 메시지가 들어 있습니다.Python - 문자열 검색, 끝까지 복사

EML의 처음 35-40 줄은 실제 이메일 메시지 뒤에 오는 헤더 정보입니다. 헤더 변경 라인의 양 때문에, 나는 그냥 목록에 내 EML 파일을 변환하고 말할 기운 다 :

print emllist[37:] 

그러나, 헤더의 마지막 행의 시작은 항상 동일하며, X로 시작 최초 도착 시간.

목표는 내 EML 파일을 구문 분석하고 X-OriginalArrivalTime의 줄 번호를 검색 한 다음 EML을 머리글 정보가 포함 된 문자열과 메시지가 포함 된 두 개의 문자열로 나눕니다.

나는 파이썬 문서를 다시 읽었지만, 이것을 공격하기위한 좋은 방법을 생각해 낼 수 없다.

은 어떤 도움이 크게

감사

답변

1

당신은 아마 정규 표현식을 피할 수 있습니다 감사합니다. 에 대해 어떻게 :

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

이렇게했습니다. 고맙습니다! –

+0

이제 문자열의 위쪽 절반을 어떻게 넣을까요? –

+0

또한 str.partition()을 사용할 수있는 것을 볼 수 있습니다 ... 대단히 감사합니다 !! –

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 플래그는 줄 바꿈과 일치하도록 .을 발생시킵니다.

+0

이 후 match.groups (1)을 인쇄 할 때 머리글뿐만 아니라 전체 메시지를 보았습니다. –

1

re 모듈은 줄을 세는 데별로 좋지 않습니다. 게다가 라인 시작 부분의 내용을 검사 할 필요가 없을 것입니다. 다음 함수는 EML 파일의 파일 이름을 입력으로 사용하여 머리글과 메시지라는 두 개의 문자열을 포함하는 튜플을 반환합니다. 이 EML 파일과 함께 작동하지만, 파이썬 has a module 이메일 파일로 작업하는 경우

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 
0

나는 확실하지 않다.

작동하지 않는 경우 헤더가 빈 줄이있는 메시지에서 분리된다는 사실이 아닙니까? 당신은 헤더와 두 개의 서로 다른 문자열로 메시지를 파견 원하기 때문에, 현재는 정규식을 피하기 위해 재미있을 것 맞아,하지만

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:] 
+0

필자는 회선 = open ('alarm.eml')을 시도했다. readlines() header = lines.index ('\ n) print header하지만 프린트는 35이고 텍스트가 아니다. –

+0

당신은 내가 다시 보여줄 필요가 없다고 생각 했으므로리스트를 나누는 법을 알고 있다는 것을 보여주었습니다 :) 업데이트되었습니다. – Ski

0

, 나는 분할(), 그 순서를 제거 생각 그래서 정규식이 유지되는 분할이 이루어지며, 파티션 (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'