Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pyparsing匹配指定文字的任意组合_Python_Pyparsing - Fatal编程技术网

Python pyparsing匹配指定文字的任意组合

Python pyparsing匹配指定文字的任意组合,python,pyparsing,Python,Pyparsing,例如: 我有文字“alpha”,“beta”,“gamma”。如何使pyparsing解析以下输入: alpha alpha|beta beta|alpha|gamma 给定的输入可以通过使用给定集合中的一个或多个由“|”分隔的非重复文本来构造。关于设置pyparsing的建议将不胜感激。请对每个使用“&”运算符,而不是“+或”|”。如果您必须拥有全部,但顺序不可预测,请使用: Literal('alpha') & 'beta' & 'gamma' 如果有些可能缺失,但每个

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

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带有合适的解析操作,对我来说很有用。非常感谢。