Python pyparsing匹配指定文字的任意组合
例如: 我有文字“alpha”,“beta”,“gamma”。如何使pyparsing解析以下输入:Python pyparsing匹配指定文字的任意组合,python,pyparsing,Python,Pyparsing,例如: 我有文字“alpha”,“beta”,“gamma”。如何使pyparsing解析以下输入: alpha alpha|beta beta|alpha|gamma 给定的输入可以通过使用给定集合中的一个或多个由“|”分隔的非重复文本来构造。关于设置pyparsing的建议将不胜感激。请对每个使用“&”运算符,而不是“+或”|”。如果您必须拥有全部,但顺序不可预测,请使用: Literal('alpha') & 'beta' & 'gamma' 如果有些可能缺失,但每个
alpha
alpha|beta
beta|alpha|gamma
给定的输入可以通过使用给定集合中的一个或多个由“|”分隔的非重复文本来构造。关于设置pyparsing的建议将不胜感激。请对每个使用“&”运算符,而不是“+或”|”。如果您必须拥有全部,但顺序不可预测,请使用:
Literal('alpha') & 'beta' & 'gamma'
如果有些可能缺失,但每个最多使用一次,则使用选项:
Optional('alpha') & Optional('beta') & Optional('gamma')
哎呀,我忘了带“|”分隔符。一种宽松的解析器是使用分隔符列表:
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")
delimitedList带有合适的解析操作,对我来说很有用。非常感谢。