2015-06-30 64 views
1

這是文本文件sb.txt如何使re.search()嘗試一個最好的嘗試方法

JOHN:ENGINEER:35?: 

現在這一塊的代碼,試圖在上面執行一個正則表達式搜索線。

biodata1 = re.search(r'([\w\W])+?:([\w\W])+?:([\w\W])+?:',line) 

現在我獲得biodata1.group一個正確的輸出(1),biodata1.group(2)和biodata1.group(3)。 「:」
但是,如果我通過刪除修改文件從最終

JOHN:ENGINEER:35? 

,並再次運行該腳本,我碰到下面的錯誤這是有道理的,因爲組(3)沒有匹配成功

Traceback (most recent call last): 
    File "dictionary.py", line 26, in <module> 
    print('re.search(r([\w\W])+?:([\w\W])+?:([\w\W])+? '+biodata1.group(1)+' '+biodata1.group(2)+' '+biodata1.group(3)) # STMT1 
AttributeError: 'NoneType' object has no attribute 'group' 

但是組(1)和組(2)應該仍然分別匹配「N」「R」。有沒有辦法避免這個錯誤,並試圖嘗試一個最佳嘗試的方法正則表達式,所以它不會失敗,並至少打印biodata1.group(1)& biodata1.group(2)。

我試圖不讓它打印biodata1.group(3)雖然沒有工作

+0

爲什麼不讓第三個組成爲可選? – jonrsharpe

回答

3

我想你誤會了什麼事,編輯輸出statment。您的整個正則表達式無法匹配,因此沒有匹配對象。

它說AttributeError: 'NoneType' object has no attribute 'group'它試圖告訴你,biodata1是None。沒有匹配時,您從re.search獲得的回報無。

要清楚,沒有辦法獲得「最佳匹配」。你要求的是,你應該做出你真正想要的決定。如果你希望組是可選的,你需要使它們可選。

根據你真的想你可以嘗試的正則表達式是什麼:

r'([\w\W])+?:([\w\W])+?:([\w\W])+?:?' 

r'([\w\W])+?:([\w\W])+?:(([\w\W])+?:)?' 

分別作出最後:和整個最後一組可選。

+0

但組(1)和組(2)會匹配正確,因爲他們的模式仍然存在?約翰:工程師:仍然存在,所以N&R至少應該匹配。 –

+2

不,您似乎認爲正則表達式是按組進行匹配的。這是一個完全沒有意義的事情。首先,正則表達式必須找到匹配(re.match),然後纔可以開始詢問組。它根本沒有找到匹配。 – CrazyCasta

+0

謝謝了吧:) –

1

正則表達式的作用與它完全匹配。沒有最好的嘗試或類似的東西。

如果您希望匹配的某些部分是可選的,您需要使用?運算符聲明它。所以你的情況你的正則表達式將需要看起來像這樣:

biodata1 = re.search(r'([\w\W])+?:([\w\W])+?:([\w\W])+?:?',line) 

而且+?(至少一次,或者根本不)等於*(至少零次),所以你可能只是這樣做:

biodata1 = re.search(r'([\w\W])*:([\w\W])*:([\w\W])*:?',line) 
2

你將不得不修改正則表達式來指示它究竟是什麼是可選的,哪些不是。 Python正則表達式沒有這種部分匹配的概念。一種可能性是將其更改爲

biodata1 = re.search(r'([\w\W])+?:(?:([\w\W])+?:(?:([\w\W])+?:)?)?',line) 

如果允許1,2或3個組匹配。在這種情況下,任何不匹配的組將在您執行時返回空字符串match.group(X)