我有以下代码片段,其中包含来自pyparsing解析器的递归语句:
def parse_query(querystr):
# <<other parsing stuff>>
queryexpression = querycondition + ZeroOrMore(Word("and") + querycondition)
try:
return queryexpression.parseString(querystr)
except ParseException as e:
logger.debug("Error parsing '{0}': \n {1}".format(querystr, e))
return None
当我提供查询时:
tokens = parse_query("HR:EE > -28.9 and BL:AA = 0 THISISNOTAND KLAS:TT eq true")
print(tokens)
它产生:
[['HR', ':', 'EE', '>', '-28.9'], 'and', ['BL', ':', 'AA', '=', '0']]
然后默默地跳过最后一个条件。没有异常抛出。
如何捕获此字符串中的错误?
答案 0 :(得分:1)
queryexpression = querycondition + ZeroOrMore(Word(“and”)+ querycondition)
不需要解析整行。 ZeroOrMore
就是这个意思。当遇到无法满足定义的内容时它会停止。它总是会成功,因为“零”是嵌套表达式匹配次数的有效选项。
如果你想一直解析到一行的结尾,那么你将需要一个明确要求的表达式,例如通过加上+ LineEnd
。
除非你这样做,否则行不是“特殊的”。默认情况下,解析表达式期望匹配输入的前缀,而不是整个输入,因为您总是可能希望使用另一个表达式来解析下一个位。