2013-04-07 72 views
1

對不明確標題的道歉,但我不知道如何以一種在單個句子中有意義的方式來表達我的問題。使用Python正則表達式搜索最外括號

所以我有一些簡單的正則表達式代碼來提取括號內的代碼。

^.*\((.*)\).* 

這成功地在Python中使用下面的代碼。當右括號)可以是最外面的括號內出現

m = re.search("^.*\((.*)\).*" ,input) 
if m: 
    print(m.groups()[0]) 

我的問題。例如,鑑於我目前的代碼時

nsfnje (19(33)22) sfssf 

爲輸入將返回

19(33 

,但我想它返回。

19(33)22 

我不知道如何解決此問題,所以任何幫助將不勝感激!

回答

6
>>> input = "nsfnje (19(33)22) sfssf" 
>>> re.search("\((.*)\)" ,input).group(1) 
'19(33)22' 

注意,此搜索最外括號,即使他們是不平衡(例如"(1(2)))))")。使用單個標準正則表達式搜索平衡圓括號是不可能的。有關更多信息,請參閱this answer

+0

[這個問題](http://stackoverflow.com/questions/5454322/python-how-to-match-nested-parentheses-with-regex)對正則表達式爲什麼不一般的工作更細節嵌套以及一些替代方法,如果你確實需要它。 – Dougal 2013-04-07 16:38:52

0

你的代碼不給19(33,它給出33)22

的問題是,在^.*您正則表達式的開頭匹配一路攀升到字符串中的最後(,而你真的想從字符串中的第一(匹配

如果您只是想要在最外括號內的內容,那麼在您的正則表達式開始時刪除.*,並且您也可以刪除結尾.*,因爲它同樣不起任何作用。

"\((.*)\)" 

如果你想整條生產線/串的匹配,以及什麼是括號內,然後通過添加?

"^.*?\((.*)\).*" 

或更好的使第一*比賽懶洋洋地,使用

"^[^(]*\((.*)\).*"