我试图创建一个查看多个括号的函数,并从里到外返回每组括号的内容。 所以给定输入(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)
你可以这样使用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))