2014-01-31 37 views
3

這是我第一次在Python中使用正則表達式,並且我無法使它正常工作。'。'的模式用任意數量的空格分隔單詞

以下是我想要實現的:我想查找所有字符串,其中有一個單詞後跟一個點,後跟另一個單詞。之後,未知數量的空白後跟(off)(on)。例如:

word1.word2 (off) 

這是我到目前爲止所出現的。

string_group = re.search(r'\w+\.\w+\s+[(\(on\))(\(off\))]', analyzed_string) 

\w+用於點

\w+用於第二字

\s+爲空格

[(\(on\))(\(off\))](off)(on)第一字

\.

我認爲最後一個表達式可能不會做我所需要的。隨着現在的實施,該方案確實找到字符串在正確的地方,但

string_group.group(0) 

輸出只是

word1.word2 (

,而不是整個表達式我在尋找。你能給我一個暗示我做錯了什麼嗎?

回答

3

[ ... ]用於字符類,除非你把量詞將匹配在他們裏面的任何一個字符[ ... ]+一個或更多的時間。

但是僅僅補充說,將無法正常工作......

\w+\.\w+\s+[(\(on\))(\(off\))]+ 

將匹配垃圾的東西一樣word1.word2)(fno(nofn太多,所以你其實並不希望使用一個字符類,因爲它會匹配字符以任何順序。你可以使用一個捕獲組,並通過OR運算符|沿非捕獲組:

\w+\.\w+\s+(\((?:on|off)\)) 

(?:on|off)將匹配onoff

現在,如果你不喜歡的括號,要在第一組中也抓住了,你可以更改到:

\w+\.\w+\s+\((on|off)\) 
+0

。爲什麼甚至使用捕獲器「(上)」還是「(關)」的組? – tenub

+0

@tenub或許OP想要提取這個值以備後用?他們在角色類中使用它,這可能表明需要這個價值。 – Jerry

3

你有你的邏輯或混淆了。

[(\(on\))(\(off\))] 

應該

\((?:on|off)\) 

[] s爲只匹配單個字符。

1

方括號是一個字符類,它匹配括號中的任何一個字符。您似乎試圖用它來匹配其中一個子正則表達式(\(one\))(\(two\))。要做到這一點的方法是使用交替操作,管道符號:(\(one\)|\(two\))

1

我認爲你的問題可能與方括號[] 它們表示一組單個字符匹配。因此,對於,你只匹配這部分字符串「(上)word1.word2」「()OFN」

:所以,你的表達將匹配任何字符以下的單一實例「字1。 WORD2(」

嘗試使用這個來代替:

re.search(r'\w+\.\w+\s+\((on|off)\)', analyzed_string) 

這場比賽假定()將在那裏,並查找‘開’或‘關’在括號內

相關問題