Python非贪婪的正则expression式

如何让一个python正则expression式像“(。*)”这样,因为“a(b)c(d)e”python匹配“b”而不是“b)c(d”?

我知道我可以使用“[^)]”而不是“。”,但我正在寻找一个更一般的解决scheme,使我的正则expression式更清洁。 有什么办法可以告诉python“嘿,尽快配对”?

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

根据文件 :

' * ',' + '和' ? “预选赛都是贪婪的, 他们匹配尽可能多的文字。 有时这种行为是不希望的; 如果RE <.*><H1>title</H1>匹配,它将匹配整个string,而不仅仅是“ <H1> ”。 添加' ? 在资格赛之后,他们以非贪婪的方式进行比赛; 尽可能less的字符将被匹配。 使用.*? 在前面的expression式中只会匹配' <H1> '。

不会\\(.*?\\)工作? 这是非贪婪的语法。

正如其他人所说的使用? *量词修饰符将解决您的直接问题,但要小心,你开始偏离正则expression式停止工作的领域,而你需要一个parsing器。 例如,string“(foo(bar))baz”会导致你的问题。

你想让它匹配“(b)”吗? 照Zitrax和Paolo的build议。 你想要它匹配“B”吗? 做

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

使用非正式比赛是一个好的开始,但是我也build议你重新考虑使用.* – 这个怎么样?

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