实施例: 我有文字“alpha”,“beta”,“gamma”。如何使pyparsing解析以下输入:
alpha
alpha|beta
beta|alpha|gamma
可以使用给定集合中的一个或多个非重复文字来构造给定输入,以“|”分隔。关于建立pyparsing的建议将不胜感激。
答案 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")