>>> g = MatchFirst( Literal("scoobydoo"), Literal("scooby") )
>>> g.parseString( "scooby" )
pyparsing.ParseException: Expected "scoobydoo" (at char 0), (line:1, col:1)
是否因为 scooby
已在字符流中被消耗而引发 ParseException,因此解析器无法回溯?我正在寻找详细的实现说明。
目前,我认为这是一个错误,因为解析器为什么会短路匹配,因为它没有搜索生产规则中的所有选择。
更新:
似乎 MatchFirst
并不完全等同于 |
运算符。为什么?
>>> g = Literal("scoobydoo") | Literal("scooby")
>>> g.parseString("scooby").asList()
['scooby']
>>> g.parseString("scoobydoo").asList()
['scoobydoo']
最佳答案
MatchFirst
(或“|”)按设计进行短路。要强制检查所有替代项,请使用 Or
(或“^”)。 oneOf("scooby scoobydoo")
也可以工作,因为 oneOf
会短路,但只有在重新排列具有前导重叠的替代单词之后。
关于python - 为什么 pyparsing 中的有序选择对于我的用例失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5777727/