我正在尝试使用 pyparsing 构建一个解析器,该解析器将匹配任意嵌套的括号内的所有文本。如果我们考虑这样的字符串:
"[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]"
我想要的是解析器以返回两个匹配的方式进行匹配:
[
"[A,[B,C],[D,E,F],G]",
"[H,I,J]"
]
我能够使用一系列与nestedExpr混合的originalTextFor来完成这个有点工作的版本,但是当你的嵌套比OriginalTextFor表达式的数量更深时,这个就会中断。
是否有一种直接的方法来仅匹配由nestedExpr获取的最外层表达式,或者一种修改其逻辑的方法,以便第一个配对匹配之后的所有内容都被视为纯文本而不是被解析?
更新:似乎接近我想要完成的一件事是嵌套 Expr 逻辑的修改版本:
def mynest(opener='{', closer='}'):
content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS))
ret = Forward()
ret <<= ( Suppress(opener) + originalTextFor(ZeroOrMore( ret | content )) + Suppress(closer) )
return ret
这让我大部分时间都在那里,尽管那里有一个额外的列表包装,我真的不需要,而且我真正想要的是那些括号包含在字符串中(而不会陷入无限的情况)递归情况,不抑制它们)。
parser = mynest("[","]")
result = parser.searchString("[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]")
result.asList()
>>> [['A,[B,C],[D,E,F],G'], ['H,I,J']]
我知道我可以通过简单的列表理解来删除这些内容,但如果我可以消除第二个冗余级别,那就太理想了。