我希望将句子与可选的结尾'other (\\w+)'
匹配。例如,正则表达式应该如下匹配两个句子并提取单词':':
我写了一个正则表达式如下。但是,我得到了一个结果(None,)
。如果我删除了最后一个?
。我会得到正确的答案。为什么呢?
>>> re.search('\w+(?: other (\\w+))?', 'A and other things').groups()
(None,)
>>> re.search('\w+(?: other (\\w+))', 'A and other things').groups()
('things',)
答案 0 :(得分:2)
如果您使用:
<span id="text">THIS IS TEST</span>
<div id="new-text"></div>
你会看到发生了什么。由于re.search(r'\w+(?: other (\w+))?', 'A and other things').group()
之后的任何内容都是可选的,因此\w+
会匹配第一个字search
。
A
返回一个包含匹配所有子组的元组,从1到多个组都在模式中。
你的.groups()
电话不会返回任何子组,因此你得到:
search
要解决您的问题,您可以使用此基于交替的正则表达式:
re.search(r'\w+(?: other (\w+))?', 'A and other things').groups()
(None,)
<强>示例:强>
r'\w+(?: other (\w+)|$)'
答案 1 :(得分:1)
正则表达式搜索的规则是它们产生 最左侧最长匹配。是的,如果可能,它会尝试为您提供更长的匹配,但最重要的是,当它找到第一个成功匹配时,它将停止进一步查看。
在第一个正则表达式中,\w+
匹配的最左边的点是A
。可选部分与那里不匹配,因此已完成。
在第二个正则表达式中,带括号的表达式是必需的,因此A
不匹配。因此,它继续寻找。 \w+
匹配and
,然后第二个\\w+
匹配things
。
请注意,对于Python中的正则表达式,尤其是那些包含反斜杠的表达式,使用r'raw strings'
编写它们是个好主意。