其他分享
首页 > 其他分享> > pyparsing中获取与asXML()等效的数据结构?

pyparsing中获取与asXML()等效的数据结构?

作者:互联网

我了解到在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)?

我确实找到了一个返回nested dict的解决方案,但是python中的字典是无序的(并且我希望标记按顺序排列),所以这对我来说不是一个解决方案.

解决方法:

Pyparsing返回一个ParseResults对象,该对象已经为您提供了该结构.您可以通过输出out.dump()来可视化句子结构:

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

您可以访问这些元素,就像它们是字典中的键一样:

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

或作为对象的属性:

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

标签:pyparsing,python
来源: https://codeday.me/bug/20191101/1980781.html