2015-11-15 65 views
3

我想匹配一个可选结束句子'other (\\w+)'。例如,正则表达式应该如下匹配两个句子并提取单词'things':为什么我不能匹配python中正则表达式的最后部分?

  • 苹果和其他东西。
  • 苹果很大。

我写了一个正则表达式,如下所示。但是,我得到了一个结果(None,)。如果我删除最后的?。我会得到正确的答案。为什么?

>>> re.search('\w+(?: other (\\w+))?', 'A and other things').groups() 
(None,) 
>>> re.search('\w+(?: other (\\w+))', 'A and other things').groups() 
('things',) 
+0

因为用“?“你在”事物“之后期待更多的单词 – tanjir

+0

?导致产生的RE匹配前面RE的0或1个重复(来自python网站) – Zety

回答

1

正则表达式搜索的规则是它们产生的最匹配的最左边的匹配。是的,如果可能的话,它会尝试给你更长时间的比赛,但最重要的是,当它发现第一次成功比赛时,它将停止进一步寻找。

在第一个正则表达式中,\w+匹配的最左边的点是A。可选部分与此不匹配,因此完成。

在第二个正则表达式中,括号表达式是强制性的,所以A不匹配。因此,它继续寻找。 \w+匹配and,然后第二个\\w+匹配things


注意,在Python中的正则表达式,特别是那些包含反斜杠,它的使用r'raw strings'写他们一个好主意。

2

如果你使用:

re.search(r'\w+(?: other (\w+))?', 'A and other things').group() 

你会看到发生了什么。由于\w+之后的任何内容都是可选的,因此您的search匹配第一个词A

作为每official documentation

.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' 
相关问题