pyparsing:无法从 ParseResults 对象获取结果
pyparsing: Unable to get results from ParseResults object
>>> 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']})
它能够正确解析事物,但我无法获得 predictors
和 covariates
的所有值。它似乎只存储最后一个值:
>>> results = reg.parseString(string)
>>> results.covariates
'f3'
>>> results['covariates']
'f3'
我想获取 predictors
和 covariates
中的所有值作为列表。知道为什么会这样吗?
默认情况下,结果名称使用与 Python 指令类似的逻辑:如果为同一键分配了多个值,则只保留最后分配的值。
但是,可以覆盖此行为,具体取决于解析器如何定义结果名称。
如果使用完整的 expr.setResultsName("XYZ")
形式,请添加 listAllMatches=True
参数。这告诉 pyparsing 保留所有已解析值的列表,并将它们 return 作为列表。
如果使用 short-cut expr("XYZ")
形式,请在名称末尾添加一个 '*'
:expr("XYZ*")
。这相当于将 listAllMatches
设置为 True。
对于使用 setResultsName
缩写形式的情况,setResultsName
中存在尾随 '*'
:expr("name*")
与 expr.setResultsName("name", listAllMatches=True)
。如果您更喜欢调用 setResultsName
,则不要使用 '*'
表示法,而是传递 listAllMatches
参数。
>>> 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']})
它能够正确解析事物,但我无法获得 predictors
和 covariates
的所有值。它似乎只存储最后一个值:
>>> results = reg.parseString(string)
>>> results.covariates
'f3'
>>> results['covariates']
'f3'
我想获取 predictors
和 covariates
中的所有值作为列表。知道为什么会这样吗?
默认情况下,结果名称使用与 Python 指令类似的逻辑:如果为同一键分配了多个值,则只保留最后分配的值。
但是,可以覆盖此行为,具体取决于解析器如何定义结果名称。
如果使用完整的 expr.setResultsName("XYZ")
形式,请添加 listAllMatches=True
参数。这告诉 pyparsing 保留所有已解析值的列表,并将它们 return 作为列表。
如果使用 short-cut expr("XYZ")
形式,请在名称末尾添加一个 '*'
:expr("XYZ*")
。这相当于将 listAllMatches
设置为 True。
对于使用 setResultsName
缩写形式的情况,setResultsName
中存在尾随 '*'
:expr("name*")
与 expr.setResultsName("name", listAllMatches=True)
。如果您更喜欢调用 setResultsName
,则不要使用 '*'
表示法,而是传递 listAllMatches
参数。