如何在PyParsing中从result对象检索值列表?

2024-07-04 14:15:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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']})

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

访问data属性不会同时给出两行

^{pr2}$

asDict()方法只返回第二行

In [5]: result.asDict()
Out[5]: {'data': ['1', '76', '0'], 'name': 'T76'}

asList()方法返回单个列表中的所有信息,当您不提前知道name和{}的长度时,很难枚举

In [6]: result.asList()
Out[6]: ['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n']

asXML()包含了我需要的所有内容,但它是XML格式的,docstring说它很快就会被弃用。在

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()同样部分地包含相关信息,但它返回一个字符串,因此必须再次解析该字符串以获取信息。在

In [8]: print result.dump()
        ['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n']
        - data: ['1', '76', '0']
        - name: 'T76'

如何以Python的方式得到这些值?在


Tags: nameindataresultoutitemoptionalword
1条回答
网友
1楼 · 发布于 2024-07-04 14:15:06

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

Lines = OneOrMore(Group(Line) + LineEnd().suppress())

现在,如果你打印(结果.转储())您可以得到:

^{pr2}$

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

print(result[1].data)
print(result[1].name)

然后得到

['1', '76', '0']
T76

或者:

for parsed_line in result:
    print("{name}: {data}".format_map(parsed_line))

然后得到:

T20: ['1', '10', '0']
T76: ['1', '76', '0']

相关问题 更多 >

    热门问题