Python非贪婪的正则表达式

So8*_*res 133 python regex regex-greedy

我如何使python正则表达式像"(.*)"这样,给定"a(b)c(d)e"python匹配"b"而不是"b"c(d"?

我知道我可以使用"[^)]"而不是".",但我正在寻找一种更通用的解决方案,让我的正则表达式更清洁.有没有办法告诉python"嘿,尽快匹配"?

Tre*_*out 171

你寻求全能的'*?'

http://docs.python.org/3/howto/regex.html#greedy-versus-non-greedy

  • 这个`*?` 的通用英文名称是什么? (2认同)
  • 这被称为**"非贪婪"**限定词 (2认同)

Pao*_*ino 62

>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'
Run Code Online (Sandbox Code Playgroud)

根据文件:

' *',' +'和' ?'限定符都是贪心的; 它们匹配尽可能多的文本.有时这种行为是不可取的; 如果RE <.*>与' <H1>title</H1>' 匹配,它将匹配整个字符串,而不仅仅是' <H1>'.?在限定符之后添加' '使其以非贪婪或最小的方式执行匹配; 尽可能少的字符将匹配.使用.*?在前面的表达式只会匹配" <H1>".


Zit*_*rax 14

不行\\(.*?\\)吗?那是非贪婪的语法.


ojr*_*rac 7

使用非贪婪匹配是一个好的开始,但我还建议您重新考虑使用.*- 怎么样?

groups = re.search(r"\([^)]*\)", x)
Run Code Online (Sandbox Code Playgroud)


Dav*_*ger 5

你想让它匹配“(b)”吗?按照 Zitrax 和 Paolo 的建议进行操作。你想让它匹配“b”吗?做

>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
Run Code Online (Sandbox Code Playgroud)


Cha*_*ens 5

正如其他人所说的那样?*量词上的修饰符将解决您的直接问题,但要小心,您开始迷失在正则表达式停止工作的区域,而您需要一个解析器.例如,字符串"(foo(bar))baz"会导致问题.