pyparsing匹配指定文字的任何组合

时间:2010-08-03 16:37:28

标签: python pyparsing

实施例: 我有文字“alpha”,“beta”,“gamma”。如何使pyparsing解析以下输入:

alpha
alpha|beta
beta|alpha|gamma

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

1 个答案:

答案 0 :(得分:3)

使用'&'每个运算符,而不是'+或'|'。如果您必须拥有所有,但使用不可预测的顺序:

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")