给定这段代码(Python 3.6):
>>> import re
>>> a = re.search(r'\(.+?\)$', '(canary) (wharf)')
>>> a
<_sre.SRE_Match object; span=(0, 16), match='(canary) (wharf)'>
>>>
为什么 re 不在第一个括号闭包处停止搜索?
预期的输出是无
。搜索应该检测到 (canary)
之后没有行尾,但它没有。
编辑:如果括号之间只有一个单词,它应该匹配,如果有多个单词,则根本不匹配。
如有任何帮助,我们将不胜感激。
最佳答案
惰性标志不会被忽略。
您会在整个字符串上找到匹配项,因为 .+?
表示匹配任何内容一次或多次,直到找到匹配项为止,根据需要扩展。如果regex was \([^)]+?\)$
它只会匹配最后一个 (wharf)
因为我们从匹配 )
+?
或者如果正则表达式是 \(.+?\)
,它会匹配 (canary)
和 (wharf)
,这表明它在偷懒。
\(.+?\)$
匹配所有内容,因为您让它匹配所有内容,直到行尾。
如果你想确保整个字符串中括号中只有一组,我们可以使用上面的“no-parentheses-regex”来做到这一点,并强制字符串的开头与你的正则表达式的开头相匹配.
^\([^)]+?\)$
试试看:https://regex101.com/r/Ts9JeF/1
解释:
^\(
:匹配字符串开头的文字(
[^)]+?
:匹配除)
之外的任何内容,根据需要多次匹配\)$
:匹配行尾的文字)$
。
或者,如果您想在括号中的单词前后允许其他单词,但不在括号中,请执行以下操作:
^[^()]*?\([^)]+?\)[^()]*$
试试看:https://regex101.com/r/Ts9JeF/3
解释:
^[^()]*?
:在字符串的开头,匹配除括号之外的任何内容零次或多次。\([^)]+?\)
:非常类似于我们之前的正则表达式[^()]*$
:匹配零个或多个非括号字符,直到字符串结束。
关于python - 可以重新忽略惰性量词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64307384/