2012-03-06 70 views
-3

某些文件(FILE.DAT)Python和正則表達式 - 搜索和匹配

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

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

輸出: 'NoneType'

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個參數。 – 2012-03-06 17:21:42

回答

1

您的第一次嘗試將搜索每行中的郵件模式。變量_mail將在循環結束時包含re.search的最後結果(以及對文件最後一行的re.search的結果,以便更加精確)。

所以你的結果將被覆蓋。

如果你想使用第一種方式,你必須添加:

if _mail: break 

結束循環

2

因爲在第一種情況下,你正在檢查模式的每一行。當您處於「From:」行時,您可以成功獲取它,但循環會繼續,併爲下一行執行匹配並覆蓋具有None的_mail對象,因爲該模式與下一行不匹配。

0

的第一個片段覆蓋_mail,無論哪一行你對匹配。因此,您只能看到應用於輸入的最後一行的正則表達式,它不返回任何結果(因此爲None)。第二個只匹配From行,這可能是你想要發生的事情。您也可以使用.startswith('From:')

0

在行sometext,你的正則表達式失敗。這意味着你沒有得到一個匹配對象,但None作爲re.search()的結果。如果您嘗試撥打.group()方法,則會失敗(因爲None當然沒有)。所以你應該得到一個AttributError(但是你的代碼在語法上是無效的,所以它根本就不應該運行)