pyparsing:无法从ParseResults对象获取结果

时间:2019-06-19 12:46:27

标签: python parsing pyparsing

>>> from pyparsing import Word, alphanums, OneOrMore, Optional, Suppress

>>> var = Word(alphanums)
>>> reg = OneOrMore(var('predictors') + Optional(Suppress('+'))) + '~' + OneOrMore(var('covariates') + Optional(Suppress('+')))

>>> string = 'y1 ~ f1 + f2 + f3'
>>> reg.parseString(string)
(['y1', '~', 'f1', 'f2', 'f3'], {'predictors': ['y1'], 'covariates': ['f1', 'f2', 'f3']})

它能够正确解析事物,但是我无法获得predictorscovariates的所有值。它似乎只存储最后一个值:

>>> results = reg.parseString(string)
>>> results.covariates
'f3'
>>> results['covariates']
'f3'

我想获取predictorscovariates中的所有值作为列表。任何想法为什么会这样?

1 个答案:

答案 0 :(得分:1)

默认情况下,结果名称使用与Python dict相似的逻辑:如果为同一键分配了多个值,则仅保留最后一个分配的值。

但是,可以根据分析器定义结果名称的方式来覆盖此行为。

如果使用完整的expr.setResultsName("XYZ")格式,请添加listAllMatches=True参数。这告诉pyparsing保留所有已解析值的列表,并将它们作为列表返回。

如果使用快捷方式expr("XYZ"),请在名称'*'的末尾添加一个expr("XYZ*")。这等效于将listAllMatches设置为True。

'*'中,对于使用setResultsName的缩写形式的情况,setResultsName位于expr("name*")expr.setResultsName("name", listAllMatches=True)之间。如果您更喜欢调用setResultsName,则不要使用'*'表示法,而应传递listAllMatches参数。