为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2019-07-31 09:26:26
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),我可以照顾那些。为什么它不会那样做,我怎么能这样做?
查看完整描述

4 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

正则表达式尝试尽可能多地匹配文本,从而消耗所有字符串。它不会在该字符串的某些部分上查找正则表达式的其他匹配项。这就是为什么你只得到一个答案。

解决方案是不使用正则表达式。如果您实际上正在尝试解析数学表达式,请使用真正的解析解决方案。如果你真的只想捕获括号内的碎片,只需在你看到(和)时递增字符计数并递增一个递减计数器。


查看完整回答
反对 回复 2019-07-31
?
三国纷争

TA贡献1804条经验 获得超7个赞

正如其他人所提到的,正则表达式不是嵌套构造的方法。我将使用pyparsing给出一个基本的例子:

import pyparsing # make sure you have this installed


thecontent = 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']]


查看完整回答
反对 回复 2019-07-31
  • 4 回答
  • 0 关注
  • 2838 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信