无论顺序如何,同时使用 OneOrMore 和 ZeroOrMore 进行 pyparsing

pyparsing using both OneOrMore and ZeroOrMore regardless of order

我正在尝试进入 pyparsing,我想创建我认为是购物篮的简单语法。下面举例说明

所以购物的规则是你必须有

生成的解析器必须执行上述要求列表。物品放在篮子里的顺序应该无关紧要,即列表

一样有效

然而应该失败的是 - 羊肉 - 西红柿 - 苹果 - 柳条筐 - 苹果

因为篮子必须始终排在列表的第一位。我不知道该怎么做 我累了:

basket + OneOrMore(vegetable) + ZeroOrMore(fruit) + StringEnd()

但是好像不行。我在 python 2.7 和 Windows 7 上使用 pyparsing。谢谢

Each 是用于指定 "all of these things, but in any order" 的 pyparsing class。将其视为 And 的一种特殊形式。事实上,Each 的运算符是 &.

您想定义篮子内容的各种有效组合,首先给出篮子后。

basket + (OneOrMore(vegetable) & ZeroOrMore(fruit) & ZeroOrMore(fish))

您可以在末尾省略 StringEnd() - 只需在调用 parseString.

时指定 parseAll=True

或者,您可以将所有成分放入一个团块中,例如:

basket + ZeroOrMore(vegetable | fruit | fish)

然后将验证放入解析操作中。实际上,与在解析器本身中使用 Each 相比,我更赞成第二种方法。一方面,在 Python 代码中实现的解析操作可以包含更复杂的规则("more vegetables than fruit"、"at least as many vegetables as fish"、"oysters only in months containing an 'R'" 等)。另外,我认为这些规则更有可能随着时间的推移而改变,所有这些改变都将局限于解析操作,而不是强制改变解析器本身。