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"会导致问题.
| 归档时间: |
|
| 查看次数: |
84645 次 |
| 最近记录: |