2016-07-27 53 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