无论顺序如何,同时使用 OneOrMore 和 ZeroOrMore 进行 pyparsing
pyparsing using both OneOrMore and ZeroOrMore regardless of order
我正在尝试进入 pyparsing,我想创建我认为是购物篮的简单语法。下面举例说明
- 篮子=['metal basket','wicker basket','plastic basket']
- 鱼=['haddock','plaice','dover sole']
- 肉=['beef','lamb','pork']
- 蔬菜=['tomatoe','onion','cabbage','carrot']
- 水果=['apple','mango','orange','strawberry']
所以购物的规则是你必须有
- 1 个购物篮
- 1 种或多种蔬菜
- 零个或多个水果
- 鱼是可选的
生成的解析器必须执行上述要求列表。物品放在篮子里的顺序应该无关紧要,即列表
- 金属篮
- 黑线鳕
- 西红柿
- 苹果
- 卷心菜
- 橙色
与
一样有效
- 柳条筐
- 西红柿
- 苹果
- 橙色
- 苹果
然而应该失败的是
- 羊肉
- 西红柿
- 苹果
- 柳条筐
- 苹果
因为篮子必须始终排在列表的第一位。我不知道该怎么做
我累了:
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'" 等)。另外,我认为这些规则更有可能随着时间的推移而改变,所有这些改变都将局限于解析操作,而不是强制改变解析器本身。
我正在尝试进入 pyparsing,我想创建我认为是购物篮的简单语法。下面举例说明
- 篮子=['metal basket','wicker basket','plastic basket']
- 鱼=['haddock','plaice','dover sole']
- 肉=['beef','lamb','pork']
- 蔬菜=['tomatoe','onion','cabbage','carrot']
- 水果=['apple','mango','orange','strawberry']
所以购物的规则是你必须有
- 1 个购物篮
- 1 种或多种蔬菜
- 零个或多个水果
- 鱼是可选的
生成的解析器必须执行上述要求列表。物品放在篮子里的顺序应该无关紧要,即列表
- 金属篮
- 黑线鳕
- 西红柿
- 苹果
- 卷心菜
- 橙色
与
一样有效- 柳条筐
- 西红柿
- 苹果
- 橙色
- 苹果
然而应该失败的是 - 羊肉 - 西红柿 - 苹果 - 柳条筐 - 苹果
因为篮子必须始终排在列表的第一位。我不知道该怎么做 我累了:
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'" 等)。另外,我认为这些规则更有可能随着时间的推移而改变,所有这些改变都将局限于解析操作,而不是强制改变解析器本身。