python - 可以重新忽略惰性量词吗?

标签 python python-3.x python-re

给定这段代码(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/

相关文章:

python - 如何使用python读写文件?

algorithm - 有人可以解释这个 RSA 示例的最后部分发生了什么吗?

python - Python 3 中已排序字符串的所有不等子集

python - 比较Python列表中字符串的出现次数

python - 两行 Python 代码导致 3 个执行 block

Python - 更新 GUI,使其始终使用更新后的列表

python - 如何从python列表中过滤一些url?

python - 替换以相同模式开头的连续行 block

python - 如何使用正则表达式从数据框中的阿拉伯文本中删除某个字母?

python - 使用 Python 从 .txt 文件创建字典