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

标签 python regex

我对 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')

有关searchmatch 主题的更多信息,请查看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/

相关文章:

python - 如何在 Anaconda(Windows)中升级 OpenCV?

javascript - 多次替换字符串之间的字符串

Ruby - 替换中间行中的字符?

python - np.mean(data.isnull()) 到底是什么?

python - 如何简化在 Python 中创建庞大的数据结构

python - Django修改密码问题,super(type, obj) : obj must be an instance or subtype of type

c# - 检查空格 Regex C#

java - 为什么java的Regex有时会抛出stackoverflow异常?

regex - Python正则表达式从字符串中提取电话号码

python - Python 中的 For 循环执行