Python 2.7 不考虑顺序同时使用一个或多个和零个或多个的pyparsing
我试图进入pyparsing,我想创建一个简单的语法,比如购物篮。下面举例说明Python 2.7 不考虑顺序同时使用一个或多个和零个或多个的pyparsing,python-2.7,pyparsing,Python 2.7,Pyparsing,我试图进入pyparsing,我想创建一个简单的语法,比如购物篮。下面举例说明 篮子=[“金属篮子”、“柳条篮子”、“塑料篮子”] 鱼=[‘黑线鳕’、‘斑鲽’、‘多佛鲽’] 肉=[‘牛肉’、‘羊肉’、‘猪肉’] 蔬菜=[‘番茄酱’、‘洋葱’、‘卷心菜’、‘胡萝卜’] 水果=[‘苹果’、‘芒果’、‘橘子’、‘草莓’] 所以购物的规则是你必须 1个购物篮 一种或多种蔬菜 零个或多个水果 鱼是可选的 生成的解析器必须执行上面的需求列表。项目在篮子中的顺序不应受到影响,即列表 的 金属筐 黑线
- 篮子=[“金属篮子”、“柳条篮子”、“塑料篮子”]
- 鱼=[‘黑线鳕’、‘斑鲽’、‘多佛鲽’]
- 肉=[‘牛肉’、‘羊肉’、‘猪肉’]
- 蔬菜=[‘番茄酱’、‘洋葱’、‘卷心菜’、‘胡萝卜’]
- 水果=[‘苹果’、‘芒果’、‘橘子’、‘草莓’]
- 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’”),等等)。此外,我认为这些规则更有可能随着时间的推移而改变,所有这些改变都将局限于解析操作,而不是强制在解析器本身进行更改。您能提供更多有关要解析的实际字符串的详细信息吗?请给出应该成功解析的字符串和不应该成功解析的字符串的示例。