返回方括号内内容的递归/插入函数?

2024-03-28 23:49:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个函数,该函数将遍历多个括号并从内到外返回每组括号的内容。 所以给定输入(9*(2*(6*6))),它将返回

(6*6)
(2*(6*6))
(9*(2*(6*6)))

到目前为止,我有这个,但我不确定如何使它为多对括号工作。它只返回最里面的支架。

^{pr2}$

Tags: 函数内容支架括号pr2
3条回答

这将以线性时间运行。在

class stacked(): # Nodes in the stack
    def __init__(self,obj,next):
        self.obj = obj
        self.next = next
    def getObj(self):
        return(self.obj)
    def getNext(self):
        return(self.next)

class stack(): # The stack itself
    def __init__(self):
        self.top=None
    def push(self,obj):
        self.top = stacked(obj,self.top)
    def pop(self):
        if(self.top == None):
            return(None)
        r = self.top.getObj()
        self.top = self.top.getNext()
        return(r)

def Framed(StringIn,l,r):
    s = stack()
    pairs=[]
    for n,k in enumerate(StringIn):
        if(k==l):
            s.push([n])
        if(k==r):
            q = s.pop()
            q.append(n+1)
            pairs.append(q)
    StringsOut = []
    for k in pairs:
        StringsOut.append(StringIn[k[0]:k[1]])
    return(StringsOut)
s = "((1+2)*(3+4))"
print(Framed(s,"(",")"))

一个非常简单的递归函数:

def parens(expr):
    if not expr:
        return
    parens(expr[expr.find('(', 1):expr.rfind(')', 0, len(expr)-1)+1])
    print(expr)

>>> parens('(9*(2*(6*6)))')
(6*6)
(2*(6*6))
(9*(2*(6*6)))
>>> parens('((1+2)*(3+4))')
(1+2)*(3+4)
((1+2)*(3+4))

您可以像这样使用pyparsing

>>> from pyparsing import nestedExpr
>>> nestedExpr('(',')').parseString('(9*(2*(6*6)))').asList()
[['9*', ['2*', ['6*6']]]]

或者,对于发电机来说是个很好的应用:

^{pr2}$

相关问题 更多 >