我正在尝试匹配所有用括号括起来的字符串。例如下面的字符串:
((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