一尘不染

在python中解析嵌套括号,按级别抓取内容

python

显然,阅读后这个问题经常出现

正则表达式,用于检测&循环的分号终止的C ++

并考虑了一段时间后,我编写了一个函数来返回任意数量的嵌套()中包含的内容

该函数可以轻松扩展到任何正则表达式对象,出于您的想法和考虑,请在此处发布。

任何重构建议将不胜感激

(请注意,我仍然对python还是陌生的,并且不想弄清楚如何引发异常或其他任何东西,所以如果函数无法弄清楚发生了什么,我只是让函数返回“ fail”)

编辑功能以考虑注释:

def ParseNestedParen(string, level):
    """
    Return string contained in nested (), indexing i = level
    """
    CountLeft = len(re.findall("\(", string))
    CountRight = len(re.findall("\)", string))
    if CountLeft == CountRight:
        LeftRightIndex = [x for x in zip(
        [Left.start()+1 for Left in re.finditer('\(', string)], 
        reversed([Right.start() for Right in re.finditer('\)', string)]))]

    elif CountLeft > CountRight:
        return ParseNestedParen(string + ')', level)

    elif CountLeft < CountRight:
        return ParseNestedParen('(' + string, level)

    return string[LeftRightIndex[level][0]:LeftRightIndex[level][1]]

阅读 222

收藏
2020-12-20

共1个答案

一尘不染

您没有确切说明函数的规格是什么,但是这种行为对我来说似乎是错误的:

>>> ParseNestedParen('(a)(b)(c)', 0)
['a)(b)(c']
>>> nested_paren.ParseNestedParen('(a)(b)(c)', 1)
['b']
>>> nested_paren.ParseNestedParen('(a)(b)(c)', 2)
['']

您的代码的其他注释:

  • Docstring说“ generate”,但是函数返回一个列表,而不是生成器。
  • 由于只返回了一个字符串,为什么要在列表中返回它?
  • 函数在什么情况下可以返回字符串fail
  • 反复调用re.findall然后丢弃结果是浪费的。
  • 您尝试重新平衡字符串中的括号,但一次只能这样做一个括号:
>>> ParseNestedParen(')' * 1000, 1)
RuntimeError: maximum recursion depth exceeded while calling a Python

object

正如Thomi在您所链接的问题中所说的那样,“正则表达式确实是完成这项工作的错误工具!”


解析嵌套表达式的通常方法是使用堆栈,方法如下:

def parenthetic_contents(string):
    """Generate parenthesized contents in string as pairs (level, contents)."""
    stack = []
    for i, c in enumerate(string):
        if c == '(':
            stack.append(i)
        elif c == ')' and stack:
            start = stack.pop()
            yield (len(stack), string[start + 1: i])

>>> list(parenthetic_contents('(a(b(c)(d)e)(f)g)'))
[(2, 'c'), (2, 'd'), (1, 'b(c)(d)e'), (1, 'f'), (0, 'a(b(c)(d)e)(f)g')]
2020-12-20