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
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>
".
使用非贪婪匹配是一个好的开始,但我还建议您重新考虑使用.*
- 怎么样?
groups = re.search(r"\([^)]*\)", x)
Run Code Online (Sandbox Code Playgroud)
你想让它匹配“(b)”吗?按照 Zitrax 和 Paolo 的建议进行操作。你想让它匹配“b”吗?做
>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
Run Code Online (Sandbox Code Playgroud)
正如其他人所说的那样?*量词上的修饰符将解决您的直接问题,但要小心,您开始迷失在正则表达式停止工作的区域,而您需要一个解析器.例如,字符串"(foo(bar))baz"会导致问题.