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)]}))])
...しかし、それらにはdict、list、およびtupleの独特の混合物が含まれており、それらを解析する方法を理解できませんでした。次に、これを試してみました:
>>> print out.asXML()
<Sentence>
<Sentence>
<Prefix>123</Prefix>
<Name>FOOBAR</Name>
<Modifier_Group>
<Modifier>testA</Modifier>
<Modifier>testB</Modifier>
</Modifier_Group>
</Sentence>
</Sentence>
...そしてそれは私が簡単に操作できるPythonデータ構造の代わりにXMLであるということを除いて、私が望んでいたものを正確に手に入れました。(XMLを解析せずに)そのようなデータ構造を取得する方法はありますか?
ネストされたdictを返すソリューションを見つけましたが、Pythonのdictは順序付けられていないため(トークンを順番に並べたい)、それは私にとってのソリューションではありません。