2009-04-19 98 views
79

如何製作像「(。*)」這樣的python正則表達式,使得「a(b)c(d)e」python匹配「b」而不是「b)c(d 「?Python非貪婪正則表達式

我知道我可以使用」[^)]「而不是」。「,但我正在尋找一個更一般的解決方案,使我的正則表達式更清潔。有沒有辦法告訴python「嘿,儘快匹配這個」?

回答

11

豈不\\(.*?\\)工作?這是非貪婪的語法。

51
>>> 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

你想讓它匹配「(b)」嗎?按照Zitrax和Paolo的建議。你想讓它匹配「b」嗎?做

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

使用的ungreedy比賽是一個良好的開端,但我也建議你重新考慮任何使用.* - 這個怎麼樣?

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

正如其他人所說的使用? *量詞上的修飾符將解決你的直接問題,但要小心,你開始偏離正則表達式停止工作的區域,而你需要一個解析器。例如,字符串「(foo(bar))baz」會導致你的問題。