Python正则表达式 - (\ w +)与复杂表达式一起使用时会产生不同的输出

Dar*_*ght 2 python regex

我对python正则表达式操作有疑问.在这里你进行我的样本测试.

>>>re.match(r'(\w+)','a-b') gives an output
>>> <_sre.SRE_Match object at 0x7f51c0033210>

>>>re.match(r'(\w+):(\d+)','a-b:1')
>>> 
Run Code Online (Sandbox Code Playgroud)

为什么第二个正则表达式条件不会给出匹配对象,尽管第一个正则表达式给出了正常字符串匹配条件的匹配对象,而不管字符串中是否有特殊字符?

但是,\ w +将匹配[az,AZ,_].我不清楚为什么(\ w +)为字符串'a-b'提供匹配的对象.如何检查给定的字符串是否不包含任何特殊字符?

pok*_*oke 6

看一下实际的匹配情况,可以了解会发生什么.

>>> re.match(r'(\w+)', 'a-b')
<_sre.SRE_Match object at 0x0000000002DE45D0>
>>> _.groups()
('a',)
Run Code Online (Sandbox Code Playgroud)

如您所见,表达式匹配a.字符序列\w仅包含实际的单词字符,但不包含破折号等分隔符.所以你实际上不能a-b只使用一个匹配\w+.

现在在第二个表达式中,人们可能会认为它b:1至少匹配,因为\w+匹配b:(\d+)匹配1.然而,由于re.match工作原理,它不会发生.正如文档提示的那样,它只会尝试匹配"在开头string".所以在使用时,表达式的开头re.match有一个隐含^的,它只能从头开始匹配.所以它实际上试图找到一个匹配的开头a.

相反,re.search如果可以在任何地方匹配表达式,您可以使用整个字符串中实际查找的内容.那么,你会得到一个结果:

>>> re.search(r'(\w+):(\d+)', 'a-b:1')
<_sre.SRE_Match object at 0x0000000002E01B58>
>>> _.groups()
('b', '1')
Run Code Online (Sandbox Code Playgroud)

有关searchvs. match主题的更多信息,请查看手册中的此部分.

最后,如果你想匹配破折号,你可以使用一个字符序列[\w-],例如:

>>> re.match(r'([\w-]+):(\d+)', 'a-b:1')
<_sre.SRE_Match object at 0x0000000002E01B58>
>>> _.groups()
('a-b', '1')
Run Code Online (Sandbox Code Playgroud)