我在下面有一个用 pyparsing 编写的简单解析器:
import pyparsing as pp
Token = pp.Word(pp.alphas)("Token")
Modifier = pp.Word(pp.nums)("Modifier")
Random = pp.Group(pp.Keyword("?") + pp.OneOrMore(Modifier))("Random")
Phrase = pp.Group(Token + pp.OneOrMore(Modifier))("Phrase")
Collection = pp.Group(pp.delimitedList(Phrase ^ Random, ","))("Collection")
tree = Collection.parseString("hello 12 2, ? 1 2, word 4, ? 3 4, testing 5")
然后我尝试这样做:
>>> for name, item in tree[0].items():
print name, item
Phrase ['testing', '5']
Random ['?', '3', '4']
...但由于某种原因,它只返回树中的最后一个Phrase
和Random
项目。我怎样才能得到所有这些?
(注意:我也尝试过这样做:
>>> for item in tree[0]:
print item
['hello', '12', '2']
['?', '1', '2']
['word', '4']
['?', '3', '4']
['testing', '5']
...但如您所见,它不会返回我需要的令牌名称。我也试过做item.name
,但那些总是返回空字符串。)
如何遍历 pyparsing 树并按顺序获取每个项目以及分配的名称?