2

示例:我有文字“alpha”、“beta”、“gamma”。如何让 pyparsing 解析以下输入:

alpha
alpha|beta
beta|alpha|gamma

给定的输入可以通过使用给定集合中的一个或多个非重复文字来构造,用“|”分隔。将不胜感激有关设置 pyparsing 的建议。

4

1 回答 1

4

对 Each 使用“&”运算符,而不是“+”或“|”。如果您必须拥有所有,但以不可预测的顺序使用:

Literal('alpha') & 'beta' & 'gamma'

如果可能缺少一些,但每个都最多使用一次,则使用 Optionals:

Optional('alpha') & Optional('beta') & Optional('gamma')

糟糕,我忘记了“|” 分隔符。一种宽松的解析器是使用 delimitedList:

delimitedList(oneOf("alpha beta gamma"), '|')

这将允许您进行任何或所有选择,但不能防止重复。使用解析操作可能是最简单的:

itemlist = delimitedList(oneOf("alpha beta gamma"), '|')
def ensureNoDuplicates(tokens):
    if len(set(tokens)) != len(tokens):
        raise ParseException("duplicate list entries found")
itemlist.setParseAction(ensureNoDuplicates)

这对我来说是最简单的方法。

编辑:

最近版本的 pyparsing 引入了解析时条件,使这种解析动作更容易编写:

itemlist = delimitedList(oneOf("alpha beta gamma"), '|')
itemlist.addCondition(lambda tokens: len(set(tokens)) == len(tokens),
                      "duplicate list entries found")
于 2010-08-03T19:33:09.293 回答