Python:如何将嵌套括号与正则表达式匹配?

Python:如何将嵌套括号与正则表达式匹配?

我正在尝试匹配具有嵌套括号的数学表达式字符串。

import re

p = re.compile('\(.+\)')str = '(((1+0)+1)+1)'print p.findall(s)

[ '(((1 + 0)+1)+1)']

我希望它匹配所有包含的表达式,例如(1 + 0),((1 + 0)+ 1)... 
我甚至不关心它是否与(((1 + 0),我可以照顾那些。

为什么它不会那样做,我怎么能这样做?


杨__羊羊
浏览 2842回答 4
4回答

12345678_0001

正则表达式尝试尽可能多地匹配文本,从而消耗所有字符串。它不会在该字符串的某些部分上查找正则表达式的其他匹配项。这就是为什么你只得到一个答案。解决方案是不使用正则表达式。如果您实际上正在尝试解析数学表达式,请使用真正的解析解决方案。如果你真的只想捕获括号内的碎片,只需在你看到(和)时递增字符计数并递增一个递减计数器。

三国纷争

正如其他人所提到的,正则表达式不是嵌套构造的方法。我将使用pyparsing给出一个基本的例子:import pyparsing # make sure you have this installedthecontent = pyparsing.Word(pyparsing.alphanums) | '+' | '-'parens     = pyparsing.nestedExpr( '(', ')', content=thecontent)这是一个用法示例:>>> parens.parseString("((a + b) + c)")输出:(                          # all of str [  (                        # ((a + b) + c)   [    (                      #  (a + b)     ['a', '+', 'b'], {}       ),                     #  (a + b)      [closed]    '+',    'c'   ], {}  )                        # ((a + b) + c) [closed] ], {}  )                          # all of str    [closed](手动完成换行/缩进/注释)编辑:修改以消除不必要的Forward,根据Paul McGuire的建议。以嵌套列表格式获取输出:res = parens.parseString("((12 + 2) + 3)")res.asList()输出:[[['12', '+', '2'], '+', '3']]
打开App,查看更多内容
随时随地看视频慕课网APP