2015-04-02 3 views
1

Im пытается сделать функцию, которая просматривает несколько скобок и возвращает содержимое каждого набора круглых скобок изнутри. Поэтому, учитывая вход (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

+0

что бы просто вернуться (1 + 2) * (3 + 4) – iotaa

+0

Взгляните на [этот ответ] (http://stackoverflow.com/a/1657068/2072035) (pyparsing). – saaj

ответ

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