如何製作像「(。*)」這樣的python正則表達式,使得「a(b)c(d)e」python匹配「b」而不是「b)c(d 「?Python非貪婪正則表達式
我知道我可以使用」[^)]「而不是」。「,但我正在尋找一個更一般的解決方案,使我的正則表達式更清潔。有沒有辦法告訴python「嘿,儘快匹配這個」?
如何製作像「(。*)」這樣的python正則表達式,使得「a(b)c(d)e」python匹配「b」而不是「b)c(d 「?Python非貪婪正則表達式
我知道我可以使用」[^)]「而不是」。「,但我正在尋找一個更一般的解決方案,使我的正則表達式更清潔。有沒有辦法告訴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>
」匹配,則它將匹配整個字符串,而不僅僅匹配「<H1>
」。限定符之後添加'?
'使其以非貪婪或最小方式執行匹配;儘可能少的字符將被匹配。在前面的表達式中使用.*?
將僅匹配'<H1>
'。
你想讓它匹配「(b)」嗎?按照Zitrax和Paolo的建議。你想讓它匹配「b」嗎?做
>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
使用的ungreedy比賽是一個良好的開端,但我也建議你重新考慮任何使用.*
- 這個怎麼樣?
groups = re.search(r"\([^)]*\)", x)
正如其他人所說的使用? *量詞上的修飾符將解決你的直接問題,但要小心,你開始偏離正則表達式停止工作的區域,而你需要一個解析器。例如,字符串「(foo(bar))baz」會導致你的問題。
根據互聯網檔案,所有指向的鏈接都是Python「re」模塊文檔的副本,所以Trey的鏈接也能正常工作。 – spiffytech 2012-07-13 16:01:10
這個`*?`的常用英文名稱是什麼? – 2015-09-04 13:44:40