Python 2.7 不考虑顺序同时使用一个或多个和零个或多个的pyparsing

Python 2.7 不考虑顺序同时使用一个或多个和零个或多个的pyparsing,python-2.7,pyparsing,Python 2.7,Pyparsing,我试图进入pyparsing,我想创建一个简单的语法,比如购物篮。下面举例说明 篮子=[“金属篮子”、“柳条篮子”、“塑料篮子”] 鱼=[‘黑线鳕’、‘斑鲽’、‘多佛鲽’] 肉=[‘牛肉’、‘羊肉’、‘猪肉’] 蔬菜=[‘番茄酱’、‘洋葱’、‘卷心菜’、‘胡萝卜’] 水果=[‘苹果’、‘芒果’、‘橘子’、‘草莓’] 所以购物的规则是你必须 1个购物篮 一种或多种蔬菜 零个或多个水果 鱼是可选的 生成的解析器必须执行上面的需求列表。项目在篮子中的顺序不应受到影响,即列表 的 金属筐 黑线

我试图进入pyparsing,我想创建一个简单的语法,比如购物篮。下面举例说明

  • 篮子=[“金属篮子”、“柳条篮子”、“塑料篮子”]
  • 鱼=[‘黑线鳕’、‘斑鲽’、‘多佛鲽’]
  • 肉=[‘牛肉’、‘羊肉’、‘猪肉’]
  • 蔬菜=[‘番茄酱’、‘洋葱’、‘卷心菜’、‘胡萝卜’]
  • 水果=[‘苹果’、‘芒果’、‘橘子’、‘草莓’]
所以购物的规则是你必须

  • 1个购物篮
  • 一种或多种蔬菜
  • 零个或多个水果
  • 鱼是可选的
生成的解析器必须执行上面的需求列表。项目在篮子中的顺序不应受到影响,即列表 的

  • 金属筐
  • 黑线鳕
  • 汤姆托
  • 苹果
  • 卷心菜
  • 橙色的
它和

  • 柳条篮
  • 汤姆托
  • 苹果
  • 橙色的
  • 苹果
然而,应该失败的是 -羔羊 -汤姆托 -苹果 -柳条篮 -苹果

因为篮子必须总是排在第一位。我不知道该怎么做 我累了:

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

但似乎不起作用。我正在Windows7上的Python2.7上使用pyparsing。感谢

每个
都是pyparsing类,用于指定“所有这些内容,但顺序不限”。把它看作是
的一种特殊形式。实际上,
每个
的运算符是
&

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

basket + (OneOrMore(vegetable) & ZeroOrMore(fruit) & ZeroOrMore(fish))
您可以在末尾不使用
StringEnd()
,只需在调用
parseString
时指定
parseAll=True

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

basket + ZeroOrMore(vegetable | fruit | fish)

然后将验证放入解析操作中。事实上,我更赞成第二种方法,而不是在解析器本身中使用
每种方法。首先,用Python代码实现的解析操作可以包含更复杂的规则(“蔬菜比水果多”、“蔬菜至少和鱼一样多”、“牡蛎只在几个月内包含一个‘R’”),等等)。此外,我认为这些规则更有可能随着时间的推移而改变,所有这些改变都将局限于解析操作,而不是强制在解析器本身进行更改。

您能提供更多有关要解析的实际字符串的详细信息吗?请给出应该成功解析的字符串和不应该成功解析的字符串的示例。