我了解到,在 pyparsing 中,您可以通过以下方式命名元素/组/节点:
token = pyparsing.Literal("Foobar")("element_name_here")
所以,我做了一个示例程序来测试它:
import pyparsing as pp
Prefix = pp.Word(pp.nums)("Prefix")
Name = pp.Literal("FOOBAR")("Name")
Modifier = pp.Word(pp.alphas)("Modifier")
Modifier_Group = pp.Group(pp.OneOrMore(Modifier))("Modifier_Group")
Sentence = pp.Group(pp.Optional(Prefix) + Name + Modifier_Group)("Sentence")
out = Sentence.parseString("123 FOOBAR testA testB")
然后,我尝试使用这些命名标记获取输出。
我试过这个:
>>> print out
[['123', 'FOOBAR', ['testA', 'testB']]]
...但这并没有让我得到令牌名称。
然后我尝试执行以下操作:
>>> print out.items()
[('Sentence', (['123', 'FOOBAR', (['testA', 'testB'], {'Modifier': [('testA', 0),
('testB', 1)]})], {'Modifier_Group': [((['testA', 'testB'], {'Modifier': [('testA', 0),
('testB', 1)]}), 2)], 'Prefix': [('123', 0)], 'Name': [('FOOBAR', 1)]}))]
>>> print dict(out)
{'Sentence': (['123', 'FOOBAR', (['testA', 'testB'], {'Modifier': [('testA', 0),
('testB', 1)]})], {'Modifier_Group': [((['testA', 'testB'], {'Modifier': [('testA', 0),
('testB', 1)]}), 2)], 'Prefix': [('123', 0)], 'Name': [('FOOBAR', 1)]})}
>>> import collections
>>> print collections.OrderedDict(out)
OrderedDict([('Sentence', (['123', 'FOOBAR', (['testA', 'testB'], {'Modifier': [
('testA', 0), ('testB', 1)]})], {'Modifier_Group': [((['testA', 'testB'],
{'Modifier': [('testA', 0), ('testB', 1)]}), 2)], 'Prefix': [('123', 0)],
'Name': [('FOOBAR', 1)]}))])
...但是它们包含字典、列表和元组的特殊混合,我不知道如何解析它们。然后,我尝试这样做:
>>> print out.asXML()
<Sentence>
<Sentence>
<Prefix>123</Prefix>
<Name>FOOBAR</Name>
<Modifier_Group>
<Modifier>testA</Modifier>
<Modifier>testB</Modifier>
</Modifier_Group>
</Sentence>
</Sentence>
...这正是我想要的,除了它是 XML 格式,而不是我可以轻松操作的 python 数据结构。有没有办法获得这样的数据结构(无需解析 XML)?
我确实找到了一个返回嵌套 dict的解决方案,但是 python 中的 dicts 是无序的,(我希望令牌按顺序排列),所以它不是我的解决方案。