为什么我不能匹配python中正则表达式的最后一部分?

时间:2015-11-15 08:28:11

标签: python regex

我希望将句子与可选的结尾'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',)

2 个答案:

答案 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

根据official documentation

  

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'编写它们是个好主意。