2013-04-07 130 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

的问题是,在^.*您正则表达式的开头匹配一路攀升到字符串中的最后(,而你真的想从字符串中的第一(匹配

如果您只是想要在最外括号内的内容,那么在您的正则表达式开始时删除.*,并且您也可以删除结尾.*,因为它同样不起任何作用。

"\((.*)\)" 

如果你想整条生产线/串的匹配,以及什么是括号内,然后通过添加?

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

或更好的使第一*比赛懒洋洋地,使用

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