2015-04-02 108 views
1

我试图做一个函数,通过多个括号查看并从内部返回每个括号的内容。 所以给出的输入(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) 
+0

你应该输入“((1 + 2)*(3 + 4))'返回 – Kevin 2015-04-02 17:51:02

+0

,将刚刚返回(1 + 2) *(3 + 4) – iotaa 2015-04-02 17:54:26

+0

看看[这个答案](http://stackoverflow.com/a/1657068/2072035)(pyparsing)。 – saaj 2015-04-02 18:18:56

回答

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

谢谢!这是完美的 – iotaa 2015-04-02 20:05:29