显然,阅读后这个问题经常出现
正则表达式,用于检测&循环的分号终止的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) ['']
您的代码的其他注释:
fail
re.findall
>>> ParseNestedParen(')' * 1000, 1) RuntimeError: maximum recursion depth exceeded while calling a Python object
>>> 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')]