Wie kann ich die Liste der Werte aus dem Ergebnisobjekt in PyParsing abrufen?

Ich habe ein einfaches Beispiel, wo ich möchte 2 Zeilen Daten zu analysieren.

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

Das Ergebnisobjekt enthält alle Werte, die ich benötige, dh die Werte der data und die name sind Listen mit auf der Linie bestellten Artikeln. Wie bekomme ich die Werte aus dem Ergebnisobjekt?

Der Zugriff auf das Datenattribut gibt nicht beide Zeilen

 In [3] result.data Out[3] (['1', '76', '0'], {}) In [4] for i in result.data: print i 1 76 0 

Die Methode asDict() gibt nur die zweite Zeile zurück

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

Die Methode asList() gibt alle Informationen in einer einzigen Liste zurück und es ist schwer aufzählen, wenn Sie die Länge des name und der data vor der Zeit kennen

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

asXML() enthält alles was ich benötige, aber es ist im XML-Format, und der docstring sagt, dass es bald veraltet werden wird.

 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() enthält teilweise wieder die relevanten Informationen, aber es gibt einen String zurück und man müsste den String erneut für Informationen parsen.

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

Wie bekommt man diese Werte auf eine Pythonik?

One Solution collect form web for “Wie kann ich die Liste der Werte aus dem Ergebnisobjekt in PyParsing abrufen?”

Gut gemacht auf die Verwendung von Namen der Ergebnisse, sind sie unglaublich hilfreich beim Zugriff auf die geparsten Felder. Aber es klingt wie Sie müssen eine Schicht der Strukturierung zu Ihrem Parser hinzufügen, so dass jede Zeile bekommt seine eigenen Daten, Namen, etc. Sie können dies durch nur Neudefinition von Linien als:

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

Nun, wenn du druckst (result.dump ()) bekommst du:

 [['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' 

Die Ausgabe von dump () ist nicht dazu gedacht, analysiert zu werden, um die Werte zu erhalten, es soll dazu beitragen, Ihnen zu zeigen, wie die strukturierten Werte abgerufen werden können. Zum Beispiel können Sie:

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

und bekomme

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

oder:

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

und bekomme:

 T20: ['1', '10', '0'] T76: ['1', '76', '0'] 
  • Python / Pyparsing - Multiline Zitate
  • Stack Overflow bei Pyparsing Ada 2005 Scoped Identifier mit Referenzhandbuch Grammatik
  • PyParsing Nicht-gieriges Match
  • Nicht finden die Saiten erwartet mit pyparsing
  • Pyparsing: Parsing von semi-JSON verschachtelten Klartextdaten in eine Liste
  • Kann ein BNF den Verbrauch verbringen?
  • Teilauswertung mit pyparsing
  • Pyparsing: Token-Standort im Ergebnisnamen erhalten
  • PyParsing: Ist diese korrekte Verwendung von setParseAction ()?
  • Wie bekomme ich PyParsing auf der Google App Engine?
  • Pyparsing nestedExpr und verschachtelte Klammern
  • Python ist die beste Programmiersprache der Welt.