pyparsing: невозможно получить результаты от объекта ParseResults - PullRequest
1 голос
/ 19 июня 2019
>>> 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 в виде списков.Есть идеи, почему это происходит?

1 Ответ

1 голос
/ 20 июня 2019

Имена результатов по умолчанию используют логику, аналогичную логике Python: если для одного и того же ключа назначено несколько значений, сохраняется только последнее присвоенное значение.

Однако это поведение может быть изменено в зависимости от того, какparser определяет имена результатов.

Если используется полная форма expr.setResultsName("XYZ"), добавьте аргумент listAllMatches=True.Это говорит pyparsing хранить список всех проанализированных значений и возвращать их в виде списка.

Если вы используете сокращенную форму expr("XYZ"), добавьте '*' в конец имени: expr("XYZ*"),Это эквивалентно установке listAllMatches в True.

Трейлинг '*' присутствует в setResultsName для тех случаев, когда вы используете краткую форму setResultsName: expr("name*") против expr.setResultsName("name", listAllMatches=True).Если вы предпочитаете вызывать setResultsName, не используйте нотацию '*', а вместо этого передайте аргумент listAllMatches.

...