我尝试使用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表达式的数量更深时,这会破坏。
是否有一种简单的方法只能匹配nestedExpr抓取的最外层表达式,或者修改其逻辑的方法,以便第一次配对匹配后的所有内容都被视为纯文本而不是被解析?
更新:似乎接近我想要完成的一件事是来自nestedExpr的逻辑修改版本:
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']]
我知道我可以通过简单的列表理解来解决这些问题,但如果我能够消除第二个冗余级别,那将是理想的。
答案 0 :(得分:2)
不确定为什么这不起作用:
sample = "[A,[B,C],[D,E,F],G] Random Middle text [H,I,J]"
scanner = originalTextFor(nestedExpr('[',']'))
for match in scanner.searchString(sample):
print(match[0])
打印:
'[A,[B,C],[D,E,F],G]'
'[H,I,J]'
当你的嵌套比OriginalTextFor表达式的数量更深时“这会中断”是什么情况?