Python关于嵌套括号

时间:2015-10-11 05:04:48

标签: python

我遇到的问题是能够取一个字符串,如“((1 + 4))+(2-1) - 3”并将其转换为[((1 + 4))列表, (2-1),3]。这也适用于其他数量的括号。我尝试用索引和计算括号而没有运气。这是我到目前为止的一些代码:

final = []
while("(" in string):
final.append(string[string.index("("):string.index(")")+1])
left = string[:string.index("(")]
right = string[string.index(")")+1:]
string = string.replace("+", ";")
string = string.replace("-", ";")
string = string.split(";")
for item in string:
   if item.strip() != "":
     final.append(item)

2 个答案:

答案 0 :(得分:0)

正则表达式(https://docs.python.org/2/library/re.html)为您提供最快和最快的解决方案。但是,如果您更喜欢易于阅读和理解的解决方案,请尝试以下方法:

def split_expr(s):
    l = []
    p =0
    expr = ''
    for c in s:
        if c=='(': p+=1
        if c==')': p-=1
        if (p==0) and (c in '+-*/'):
            l.append(expr)
            expr = ''
        else:
            expr += c
    else:
        l.append(expr)
    return l

您还可以看到此帖子(How to split but ignore separators in quoted strings, in python?)。它可以激发您一些更优雅的解决方案。

答案 1 :(得分:-1)

您可能希望使用正则表达式。这个答案可能不是最佳的,但请看一下如何使用re模块:

>>> import re
>>> regex = re.compile(r"\s+[\+\*\-\/]\s+")
>>> s = "((1+4)) + (2-1) - 3"
>>> for sub in regex.findall(s):
...     s = s.replace(sub, " ")
>>> s
'((1+4)) (2-1) 3'
>>> s.split()
['((1+4))', '(2-1)', '3']

因此,我们使用re.compile编译正则表达式,这样我们可以一次又一次地使用正则表达式,而不必每次都编译它。然后我们使用findall查找满足正则表达式的所有子字符串,然后我们获取每个子字符串并使用字符串上的replace函数将其替换为单个空格。然后,我们使用split并将默认分隔符设置为" "来分割字符串。

编辑:因为我完全忘记了,你可以使用re.split,它一举完成上述所有内容。

>>> s = "((1+4)) + (2-1) - 3"
>>> regex.split(s)
['((1+4))', '(2-1)', '3']

谢谢@BurhanKhalid:)