2012-07-21 47 views
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中的字符串是無序的(我想要令牌的順序),所以它不是我的解決方案。

回答

4

Pyparsing返回已經爲您提供該結構的ParseResults對象。您可以通過打印out.dump()可視化你的句子結構:

>>> print out.Sentence.keys() 
['Modifier_Group', 'Prefix', 'Name'] 
>>> print out.Sentence['Prefix'] 
123 

或作爲對象的屬性:

>>> print out.Sentence.Name 
FOOBAR 
>>> print out.Sentence.Prefix 
123 

>>> print out.dump() 
[['123', 'FOOBAR', ['testA', 'testB']]] 
- Sentence: ['123', 'FOOBAR', ['testA', 'testB']] 
    - Modifier_Group: ['testA', 'testB'] 
    - Modifier: testB 
    - Name: FOOBAR 
    - Prefix: 123 

你可以,如果他們在一個字典鍵訪問這些元素