我对 python 正则表达式操作有疑问。给你我的 sample 测试。
>>>re.match(r'(\w+)','a-b') gives an output
>>> <_sre.SRE_Match object at 0x7f51c0033210>
>>>re.match(r'(\w+):(\d+)','a-b:1')
>>>
为什么第二个正则表达式条件不给出匹配对象,尽管第一个正则表达式为普通字符串匹配条件提供匹配对象,而不管字符串中是否有特殊字符?
但是,\w+ 将匹配 [a-z,A-Z,_]。我不清楚为什么 (\w+) 为字符串 'a-b' 提供匹配的对象。如何检查给定的字符串是否不包含任何特殊字符?
最佳答案
看看实际的比赛会让您了解会发生什么。
>>> re.match(r'(\w+)', 'a-b')
<_sre.SRE_Match object at 0x0000000002DE45D0>
>>> _.groups()
('a',)
如您所见,表达式匹配a
。字符序列 \w
仅包含实际的单词字符,但不包含破折号等分隔符。所以你实际上不能只使用 \w+
来匹配 a-b
。
现在在第二个表达式中,人们可能认为它至少会匹配 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')
有关search
与match
主题的更多信息,请查看this section in the manual .
最后,如果你也想匹配破折号,你可以使用字符序列 [\w-]
例如:
>>> re.match(r'([\w-]+):(\d+)', 'a-b:1')
<_sre.SRE_Match object at 0x0000000002E01B58>
>>> _.groups()
('a-b', '1')
关于Python 正则表达式 - (\w+) 与复杂表达式一起使用时会产生不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19589617/