2012-03-06 3 views
-3

일부 파일 (FILE.DAT) 아웃파이썬과 정규식 - 검색과 일치

#####Start#### 
sometext 
sometext 
From: [email protected] 
some text 
some text 
####End##### 

1

import re 
for line in open('file.dat'): 
    _mail=re.search(r"\[email protected]\w+\.\w{2,4}").group() 
print(type(_mail)) 

: 'NoneType'

2

import re 
for line in open('file.dat'): 
    if(re.match(r"From:.*",line)): 
     _mail=re.search(r"\[email protected]\w+\.\w{2,4}").group() 
print _mail 

아웃 :

나를 설명 [email protected]하시기 바랍니다. 첫 번째 방법을 사용할 수없는 이유는 무엇입니까?

+2

올바른 코드를 입력하여 시작하십시오 .re.search가 예상대로 작동하지 않습니다. 2 개의 논쟁. –

답변

1

첫 번째 시도는 각 줄의 메일 패턴을 검색합니다. 변수 _mail은 루프의 마지막에 re.search의 마지막 결과를 포함합니다 (더 정확히 말하면 파일의 마지막 줄에있는 re.search의 결과).

결과를 덮어 씁니다. 첫 번째 방법을 사용하려면

, 당신은 추가해야합니다 :

if _mail: break 

루프

2

첫 번째 경우에는 각 줄마다 패턴을 확인하기 때문에. "보낸 사람 :"줄에 있지만 루프가 계속되고 다음 줄에 일치하는 경우 성공적으로 가져오고 패턴이 다음 줄에서 일치하지 않으므로 없음을 사용하여 _mail 개체를 재정의합니다.

0

를 종료하려면 첫 번째 조각에 관계없이 당신에 대해 일치하는 줄이 중, _mail을 덮어 씁니다. 결과적으로 입력의 마지막 줄에 적용된 정규식 만 표시되며 결과는 반환되지 않습니다 (따라서 None). 두 번째는 From 줄과 일치합니다. 아마도 당신이 원하는 일일 것입니다. 대신 .startswith('From:')을 사용할 수도 있습니다.

0

sometext 라인에서 정규 표현식이 실패합니다. 즉, 일치 객체를 가져 오지 않고 의 결과 인 None을 의미합니다. 그런 다음 .group() 메서드를 호출하면 실패합니다 (None에는 물론 없기 때문에). 따라서 AttributError이 있어야합니다 (그러나 코드는 어쨌든 구문 상 유효하지 않으므로 전혀 실행하지 않아야합니다.)