当前位置: 首页 > 面试题库 >

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

夹谷浩宕
2023-03-14
问题内容

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

正则表达式,用于检测&循环的分号终止的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]]

问题答案:

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

>>> 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')]


 类似资料:
  • 尽管我在编译/解析方面的知识有限,但我还是敢于为OData$filter表达式构建一个小型递归下降解析器。解析器只需要检查表达式的正确性,并在SQL中输出相应的条件。由于输入和输出具有几乎相同的标记和结构,这相当简单,我的实现实现了我想要的90%。 但是现在我被括号卡住了,括号出现在逻辑表达式和算术表达式的不同规则中。ABNF中的完整OData语法在这里,所涉及的规则的精简版本如下: 这个语法如何

  • 问题内容: 用Python解析匹配括号中包含的大量文本的最佳方法是什么? 最初应该返回: 将其作为输入应返回: 应该返回: 问题答案: 伪代码:

  • 问题内容: 我必须与API进行交互,并且响应格式(根据我的阅读)似乎结构不良。我发现一个Google 网上论坛在这里回答了一个类似的问题,但是我在实现Response类来处理Gson.fromJson时遇到了麻烦。有没有我想念的例子? 问题答案: JSON对象可以由或Javabean类表示。这是一个使用Javabean的示例。 如下使用它:

  • 我有下一个带嵌套括号的字符串: 我想用打印出来的每个括号的值填充一个数组:

  • 期望的行为 我有一个输入验证,除其他外,测试长度(

  • 我想在像这样的文本中插入()并将它们放入数组中,但里面可能有一些嵌套的括号。 文本: 应该这样处理: 我怎么能这么做?