3
我瞭解到,在pyparsing,你可以通過做這個名稱的元素/組/節點:所以在pyparsing中獲取等同於asXML()的數據結構?
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)?
我找到了一個解決方案,它返回nested dict,但python中的字符串是無序的(我想要令牌的順序),所以它不是我的解決方案。