Я узнал, что в 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)?
Я нашел решение, которое возвращает вложенный словарь, но dicts в python неупорядочены (и я хочу, чтобы токены были в порядке), поэтому для меня это не решение.