Pyparsing - 匹配最外面的嵌套括号

时间:2016-10-05 22:53:52

标签: nested brackets pyparsing

我尝试使用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']]

我知道我可以通过简单的列表理解来解决这些问题,但如果我能够消除第二个冗余级别,那将是理想的。

1 个答案:

答案 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表达式的数量更深时“这会中断”是什么情况?