正则表达式匹配括号内的字符串 - python

我正在尝试匹配所有用括号括起来的字符串。例如下面的字符串:

((5.85B8.5V + ?; 1.79") + (6.78A0 + ?; .97"); 4.760")

我要匹配以下所有内容:

5.85B8.5V +?; 1.79英寸
6.78A0 +?; .97英寸
(5.85B8.5V +?; 1.79“)+(6.78A0 +?; .97”); 4.760英寸

我从来没有真正掌握过正则表达式,所以遇到了麻烦。我现在所拥有的是:

pattern = '\((.*?)\)'
m = re.match(pattern, string)
print m.group()
'((5.85B8.5V + ?; 1.79")'

这有点接近,但是得到了两种类型的第一个括号,而不是开头和结尾的括号。有任何想法吗?

谢谢!

python大神给出的解决方案

正则表达式不好解析嵌套结构,但是,某些方言提供了递归运算符?R?n,它们可以帮助您解决此问题。 Python的股票re不支持它,但是幸运的是,有一个regex模块可以实现:

>>> import regex
>>> s = '((5.85B8.5V + ?; 1.79") + (6.78A0 + ?; .97"); 4.760")'
>>> regex.findall(r'(?=(\((?:[^()]|(?1))*\)))', s)
['((5.85B8.5V + ?; 1.79") + (6.78A0 + ?; .97"); 4.760")', '(5.85B8.5V + ?; 1.79")', '(6.78A0 + ?; .97")']

也就是说,正则表达式不是解析通用上下文无关语言(您的字符串显然属于它)的最佳选择。考虑使用真正的解析器,您可以使用pyParsing或类似的程序包构建该解析器,或者只手工编写代码-在这里相当琐碎:

def expressions(s):
    stack = []
    for n, c in enumerate(s):
        if c == '(':
            stack.append(n+1)
        elif c == ')':
            yield s[stack.pop():n]

for x in expressions(s):
    print x