2016-07-27 47 views
0
(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)+)\s+(\w+) 

用來匹配字符串蟒蛇正則表達式非捕獲組處理

123 FEX-1-80 Online N2K-C2248TP-1GE SSDFDFWFw23r23 

爲什麼這部作品在regexr.com但是Python 3.5.1無法找到匹配

r'(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+))' 

最多可匹配

123 FEX-1-80 Online N2K-C2248TP 

但第二個連字符 - 組( 4)不匹配

據我所知,非捕獲組角色可以在組中出現不止一次,這裏出了什麼問題?

(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)+)\s+(\w+) 

這一個不:

回答

0

這個正則表達式完整的輸入字符串匹配

(1[0-9]{2})\s+(\w+(?:-\w+)+)\s+(\w+)\s+(\w+(?:-\w+)) 

後者丟掉了最後的非捕獲組後+,並且它缺少\s+(\w+)末尾匹配輸入字符串末尾的SSDFDFWFw23r23

據我所知,非捕獲組角色可以在組中出現多次,這裏出了什麼問題?

我不確定我關注。一個非捕獲組真的只是在那裏對正則表達式的一部分進行分組。

(?:-\w+)或只是-\w+都將匹配後面跟着一個或多個「字」字符(\w+)連字符(-)。這個正則表達式是否在非捕獲組中並不重要。如果要匹配該模式的重複次數,則可以在非捕獲組之後使用+修飾符,例如(?:-\w+)+。該模式將匹配像-foo-bar-baz這樣的字符串。

所以你的第二個正則表達式與重複模式不匹配的原因是因爲它缺少+修飾符。

0

只是一個評論,不是一個真正的答案,但爲了清晰起見,我把它作爲答案。
對於正則表達式來說相對較新,應該使用詳細模式。有了這個,你的表情變得更可讀:

(1[0-9]{2})\s+  # three digits, the first one needs to be 1 
(\w+(?:-\w+)+)\s+ # a word character (wc), followed by - and wcs 
(\w+)\s+   # another word 
(\w+(?:-\w+)+)\s+ # same expression as above 
(\w+)    # another word 

此外,檢查,如果你(第二和第四)的表達可能被改寫爲[\w-]+ - 這是不一樣的你,並會匹配其他子而努力一般避免嵌套括號。

關於你的問題,第二個字符串不能匹配,因爲你所有的表達式都是強制的(而第5個例子中缺少第5個組合,所以它會失敗)。

請參閱a demo on regex101.com

+0

感謝您的鏈接,甚至比regexr.com更強大。 '[\ w - ] +'大概可以滿足我的需要,它是如何從'\ w +不同(: - ?\ w +)+' – sdaffa23fdsf

+0

這是很不同:[** **第一(https://開頭regex101 .com/r/bX5eR1/3)和[** second **](https://regex101.com/r/bX5eR1/4) – Jan