显然,阅读后这个问题经常出现
正则表达式,用于检测&循环的分号终止的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
正如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的示例。 如下使用它:
我有下一个带嵌套括号的字符串: 我想用打印出来的每个括号的值填充一个数组:
期望的行为 我有一个输入验证,除其他外,测试长度(
我想在像这样的文本中插入()并将它们放入数组中,但里面可能有一些嵌套的括号。 文本: 应该这样处理: 我怎么能这么做?