[英]Why can't I match the last part of my regular expression in python?
我想匹配一个带有可选结尾'other (\\\\w+)'
的句子。 例如,正则表达式应该如下匹配两个句子并提取单词'things':
我写了一个正则表达式如下。 但是,我得到了一个结果(None,)
。 如果我删除最后一个?
。 我会得到正确的答案。 为什么?
>>> re.search('\w+(?: other (\\w+))?', 'A and other things').groups()
(None,)
>>> re.search('\w+(?: other (\\w+))', 'A and other things').groups()
('things',)
如果您使用:
re.search(r'\w+(?: other (\w+))?', 'A and other things').group()
你会看到发生了什么。 由于后什么\\w+
是可选的search
第一个词匹配A
。
根据官方文件 :
.groups()
返回包含匹配的所有子组的元组,从1到多个组都在模式中。
并且您的search
调用不会返回任何子组,因此您得到:
re.search(r'\w+(?: other (\w+))?', 'A and other things').groups()
(None,)
要解决您的问题,您可以使用此基于交替的正则表达式:
r'\w+(?: other (\w+)|$)'
例子:
>>> re.search(r'\w+(?: other (\w+)|$)', 'A and other things').group()
'and'
>>> re.search(r'\w+(?: other (\w+)|$)', 'The apple is big').group()
'big'
正则表达式搜索的规则是它们产生最左边的最长匹配。 是的,如果可能的话,它会尝试给你更长的匹配,但最重要的是,当它找到第一个成功的匹配时,它将停止进一步查看。
在第一个正则表达式中, \\w+
匹配的最左边的点是A
可选部分与那里不匹配,所以就完成了。
在第二个正则表达式中,带括号的表达式是必需的,因此A
不匹配。 因此,它继续寻找。 该\\w+
匹配and
,然后第二\\\\w+
匹配things
。
请注意,对于Python中的正则表达式,尤其是那些包含反斜杠的表达式,使用r'raw strings'
编写它们是个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.