"""
method to parse filter string
"""
prop = pp.WordStart(pp.alphas) + pp.Word(pp.alphanums +
"_").setResultsName("prop")
value = (pp.QuotedString("'") | pp.QuotedString('"') | pp.Word(
pp.printables, excludeChars=",")).setResultsName("value")
types_ = pp.oneOf("re eq ne gt ge lt le").setResultsName("types")
flags = pp.oneOf("C I").setResultsName("flags")
comma = pp.Literal(',')
quote = (pp.Literal("'") | pp.Literal('"')).setResultsName("quote")
type_exp = pp.Group(pp.Literal("type") + pp.Literal(
"=") + quote + types_ + quote).setResultsName("type_exp")
flag_exp = pp.Group(pp.Literal("flag") + pp.Literal(
"=") + quote + flags + quote).setResultsName("flag_exp")
semi_expression = pp.Forward()
semi_expression << pp.Group(pp.Literal("(") +
prop + comma + value +
pp.Optional(comma + type_exp) +
pp.Optional(comma + flag_exp) +
pp.Literal(")")
).setParseAction(
self.parse_filter_obj).setResultsName("semi_expression")
expr = pp.Forward()
expr << pp.infixNotation(semi_expression, [
("not", 1, pp.opAssoc.RIGHT, self.not_operator),
("and", 2, pp.opAssoc.LEFT, self.and_operator),
("or", 2, pp.opAssoc.LEFT, self.or_operator)
])
result = expr.parseString(filter_str)这对于pyparation2.4.7很好,但对最新的pyparsing却不起作用。给出的示例输入如下:
filter_str = 'not (dn,"org-root/ls-C1_B1", type="eq")'这将导致出现最新的latest解析模块3.0.6的异常。
pyparsing.exceptions.ParseException: Expected 'or' term, found 'dn' (at char 5), (line:1, col:6). 我尝试了不同的方法来解决这个问题,但没有排除这个异常。如果这种做法有明显的错误,请告诉我。
发布于 2021-12-18 22:35:04
抓得好!这是pyparing3.0中PEP8 8兼容性逻辑中的一个bug,在这里,我向WordStart添加了对参数的支持,支持wordChars和word_chars。我会在下一个版本中修复它。同时,您可以通过将Word(pp.alphas)更改为Word(word_chars=pp.alphas)来解决该错误。
解析器上的其他几个注释:
semi_expression或expr。semi_expression不是递归表达式,expr中的递归已经在infixNotation方法中得到了处理。F 214
pp.Keyword的prop匹配(例如,将pp.Literal("type")改为pp.Keyword("type"),以及您的运算符"not“、" and”和“or”)。这些注释与您所看到的问题无关,如果没有这些更改,您的语法就会正常工作。它们只是您可能选择对解析器代码进行的一些可选的改进。
https://stackoverflow.com/questions/70403306
复制相似问题