Python非贪婪的正则表达式

时间:2009-04-19 23:24:03

标签: python regex regex-greedy

如何制作类似“(。*)”的python正则表达式,使得“a(b)c(d)e”python匹配“b”而不是“b”c(d“?

我知道我可以使用“[^)]”代替“。”,但我正在寻找一种更通用的解决方案,让我的正则表达式更清晰一些。有没有办法告诉python“嘿,尽快匹配”?

7 个答案:

答案 0 :(得分:141)

你寻求全能的'*?'

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

  

非贪婪的限定词*?,+?,??或{m,n}? [...]匹配尽可能少   文字尽可能。

答案 1 :(得分:58)

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

According to the docs

  

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

答案 2 :(得分:13)

\\(.*?\\)不会有效吗?那是非贪婪的语法。

答案 3 :(得分:5)

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

答案 4 :(得分:4)

使用不合适的比赛是一个良好的开端,但我也建议你重新考虑使用.* - 这是怎么回事?

groups = re.search(r"\([^)]*\)", x)

答案 5 :(得分:3)

你想要它匹配“(b)”吗?像Zitrax和Paolo所建议的那样。你想要它匹配“b”吗?做

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

答案 6 :(得分:0)

首先,我不建议在正则表达式中使用“ *”。是的,我知道,它是最常用的多字符定界符,但它不是一个好主意。这是因为,尽管它确实匹配该字符的任何重复量,但“ any”仍包含0,这通常是您要为其抛出语法错误而不是接受的东西。相反,我建议使用+符号,该符号与长度大于1的任何重复匹配。此外,从我所看到的来看,您正在处理定长括号括起来的表达式。结果,您可能可以使用{x, y}语法来专门指定所需的长度。

但是,如果您确实需要非贪婪的重复,我建议您咨询功能强大的?。将其放置在任何正则表达式重复说明符的末尾时,将强制正则表达式的该部分查找尽可能少的文本。

话虽这么说,我对?会非常小心,因为它就像Who博士中的Sonic螺丝刀一样,有做事的倾向,如果不这样做,我应该如何“稍微”把不希望有的事放进去仔细校准。例如,要使用示例输入,它将标识((1)(注意缺少第二个rparen)作为匹配项。