在我正在开发的应用程序中,我们有一个将某些字符组合在一起的DSL,可以对它们进行分组或不进行分组。括号确定组。例如,良好的输入:

123
12(34)
1(234)


输入错误:

12(34


本质上,我希望所有不匹配的括号都不要解析,因为出于我的目的,这应该是语法错误。我制作了此MVCE,以显示我的pyparsing代码遇到的问题:

import pyparsing as pp

def Syntax():
    lpar = pp.Literal('(').suppress()
    rpar = pp.Literal(')').suppress()
    rank = pp.Word('12345678', exact=1) #card ranking
    ranks = pp.OneOrMore(rank)
    rank_grouping = pp.Group(lpar + ranks + rpar)
    atom = ranks | rank_grouping
    return pp.OneOrMore(atom)

mvce_parser = Syntax()
try:
    mvce_parser.parseString("(76)(54")
except pp.ParseException:
    print("Exception1 was thrown!")
else:
    print("Exception1 not thrown :(")

try:
    mvce_parser.parseString("(76(54)")
except pp.ParseException:
    print("Exception2 was thrown!")
else:
    print("Exception2 not thrown :(")


输出:

$ python test.py
Exception1 not thrown :(
Exception2 was thrown!


我这里的问题是,这里的第一个示例字符串(76)(54解析并返回[['7','6']],但是没有抛出我想要的ParseException。但是,第二个确实按预期失败。

我怀疑这是OneOrMore抑制其余部分的异常,然后返回到目前为止的结果的结果。

如何更改代码以避免这种不一致的问题?即使OneOrMore很方便,是否还有其他方法可以不使用OneOrMore来执行此操作?

最佳答案

因此,您想解析整个字符串。

为此,您需要在语法中明确添加StringEnd()

return pp.OneOrMore(atom) + pp.FollowedBy(pp.StringEnd())


或为parseString调用提供parseAll = True参数

mvce_parser.parseString("(76)(54", parseAll=True)

关于python - 将括号与OneOrMore匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31529972/

10-11 06:59