Задумывались ли вы об использовании setResultsName с listAllMatches = True? Вот демо:
from pyparsing import *
aExpr = Word("A", nums)
bExpr = Word("B", nums)
cExpr = Word("C", nums)
grammar = ZeroOrMore(aExpr.setResultsName("A",listAllMatches=True) |
bExpr.setResultsName("B",listAllMatches=True) |
cExpr.setResultsName("C",listAllMatches=True) )
results = grammar.parseString("A1 B1 A2 C1 B2 A3")
print results.dump()
печать:
['A1', 'B1', 'A2', 'C1', 'B2', 'A3']
- A: ['A1', 'A2', 'A3']
- B: ['B1', 'B2']
- C: ['C1']
EDIT:
Более новая форма для этого будет:
grammar = ZeroOrMore(aExpr("A*") | bExpr("B*") | cExpr("C*") )
Я обнаружил, что ".setResultsName"
слишком многословен и беспорядочен при определении грамматик, что противоречило моему намерению побуждать людей использовать имена результатов.