提升正则表达式忽略“最短匹配”

时间:2017-01-17 00:09:01

标签: regex boost

以下是Python3会话的逐字副本:

~/Documents $ python3
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> text = 'This (is) a (test)'
>>> print(text)
This (is) a (test)
>>> re.findall('h', text)
['h']
>>> re.findall('\(.+?\)', text)
['(is)', '(test)']
>>> re.findall('\(.+?\)$', text)
['(is) a (test)']
>>> 

我希望最后的findall只返回 (test),因为它是字符串末尾\(.+?\) 的最短匹配< / em>的。相反,它返回(is) a (test)。对于较长的测试字符串,它也是如此:

>>> text = 'This (is) (possibly) a (test)'
>>> re.findall('\(.+?\)', text)
['(is)', '(possibly)', '(test)']
>>> re.findall('\(.+?\)$', text)
['(is) (possibly) a (test)']

它与(第一次出现的匹配原因是什么?

请注意,我正在寻找替代正则表达式。这个问题是关于具体的行为,因为它似乎是错误的。

我只使用Python来验证;这是由Adobe的InDesign论坛中的this question提示的,而InDesign也使用了Boost:

  

Adob​​e Indesign提供最佳的页面设计:Indesign和它的相关SDK取决于Boost Boost.Regex,Boost.Functional等。
  (http://www.boost.org/users/uses_shrink.html sic 错别字))

1 个答案:

答案 0 :(得分:3)

  

它与第一次出现(on?

)的原因相符

因为解析器状态机从左侧开始。这是它的工作原理。如果从第一个字符开始匹配,为什么要拒​​绝?

那应该给你一个线索。您可能希望要求中间不出现括号:[^(]而不是.

Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> text = 'This (is) (possibly) a (test)'
>>> import re
>>> re.findall('\(.+?\)$', text)
['(is) (possibly) a (test)']
>>> re.findall('\([^(]+?\)$', text)
['(test)']
>>>