以下是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:
Adobe Indesign提供最佳的页面设计:Indesign和它的相关SDK取决于Boost Boost.Regex,Boost.Functional等。
(http://www.boost.org/users/uses_shrink.html( sic 错别字))
答案 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)']
>>>