首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PyParsing中从结果对象中检索值列表?

如何在PyParsing中从结果对象中检索值列表?
EN

Stack Overflow用户
提问于 2016-11-18 00:34:56
回答 1查看 1.6K关注 0票数 2

我有一个简单的例子,我想解析2行数据。

代码语言:javascript
复制
In [1] from pyparsing import Word, nums, OneOrMore, Optional, Suppress, alphanums, LineEnd, LineStart

       Float = Word(nums + '.' + '-')
       Name = Word(alphanums)
       Line = OneOrMore(Float)('data') + Suppress(Optional(';')) + Optional('%') + Optional(Name)('name')

       Lines = OneOrMore(Line + LineEnd())

       string = ''' 1   10  0       T20
            1   76  0   T76
       '''
       result = Lines.parseString(string)

In [2] result
Out[2] (['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n'], {'data': [(['1', '10', '0'], {}), (['1', '76', '0'], {})], 'name': ['T20', 'T76']})

结果对象包含我需要的所有值,即dataname键的值都是列表,其中的项是根据行排序的。如何从结果对象中获取值?

访问数据属性并不会给出两行

代码语言:javascript
复制
In [3] result.data
Out[3] (['1', '76', '0'], {})

In [4] for i in result.data:
           print i
       1
       76
       0

asDict()方法只返回第二行

代码语言:javascript
复制
In [5]: result.asDict()
Out[5]: {'data': ['1', '76', '0'], 'name': 'T76'}

asList()方法返回单个列表中的所有信息,如果事先不知道namedata的长度,则很难枚举

代码语言:javascript
复制
In [6]: result.asList()
Out[6]: ['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n']

asXML()包含我所需的所有内容,但它是XML格式的,而docstring表示它将很快被废弃。

代码语言:javascript
复制
In [7]: print result.asXML() # The documentation says this will be deprecated
        <data>
          <data>1</data>
          <ITEM>10</ITEM>
          <ITEM>0</ITEM>
          <name>T20</name>
          <ITEM>
        </ITEM>
          <data>1</data>
          <ITEM>76</ITEM>
          <ITEM>0</ITEM>
          <name>T76</name>
          <ITEM>
        </ITEM>
        </data>

dump()再次部分地包含相关信息,但它返回一个字符串,其中一个必须再次解析该字符串以获取信息。

代码语言:javascript
复制
In [8]: print result.dump()
        ['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n']
        - data: ['1', '76', '0']
        - name: 'T76'

一个人是如何以毕加索的方式得到这些值的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 02:29:24

在使用结果名称方面做得很好,它们在访问解析字段时非常有用。但是,听起来您需要在解析器中添加一层结构,这样每一行都可以获得自己的数据、名称等。只需将行重新定义为:

代码语言:javascript
复制
Lines = OneOrMore(Group(Line) + LineEnd().suppress())

现在,如果您打印(result.dump()),您将得到:

代码语言:javascript
复制
[['1', '10', '0', 'T20'], ['1', '76', '0', 'T76']]
[0]:
  ['1', '10', '0', 'T20']
  - data: ['1', '10', '0']
  - name: 'T20'
[1]:
  ['1', '76', '0', 'T76']
  - data: ['1', '76', '0']
  - name: 'T76'

不是要解析dump()的输出来获取值,而是为了帮助您了解如何检索结构化值。例如,您可以:

代码语言:javascript
复制
print(result[1].data)
print(result[1].name)

并获取

代码语言:javascript
复制
['1', '76', '0']
T76

或者:

代码语言:javascript
复制
for parsed_line in result:
    print("{name}: {data}".format_map(parsed_line))

并得到:

代码语言:javascript
复制
T20: ['1', '10', '0']
T76: ['1', '76', '0']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40667527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档