递归/迭代函数返回括号内的内容?

时间:2015-04-02 17:49:49

标签: python python-3.x recursion iteration

我试图创建一个查看多个括号的函数,并从里到外返回每组括号的内容。 所以给定输入(9 *(2 *(6 * 6))),它将返回

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

到目前为止,我有这个,但我不知道如何让它适用于多对括号。它只返回最内层的支架。

def in_brackets(str) :   
    close_b = 0
    open_b = 0

    if len(str) < 5 : 
        return True

    while str[close_b] != ')':
        close_b += 1
        if str[close_b] == '(':
            open_b = close_b    

    in_b = str[open_b:close_b + 1]

    return(in_b)

3 个答案:

答案 0 :(得分:1)

你可以这样使用pyparsing

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

或者,对发电机有很好的应用:

>>> def pcon(string):
...     stack = []
...     for i, c in enumerate(string):
...         if c == '(':
...             stack.append(i)
...         elif c == ')' and stack:
...             start = stack.pop()
...             yield string[start + 1: i]
... 
>>> for s in pcon('(9*(2*(6*6)))'):
...    print "({})".format(s)
... 
(6*6)
(2*(6*6))
(9*(2*(6*6)))

答案 1 :(得分:0)

这将以线性时间运行。

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,"(",")"))

答案 2 :(得分:0)

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

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))