`Pyparsing`: Iteration über` ParsedResults`

Ich habe gerade angefangen pyparsing heute Abend und ich habe eine komplexe Grammatik, die beschreibt einige Quellen, die ich bin sehr effektiv zu arbeiten. Es war sehr einfach und sehr mächtig. Allerdings habe ich Probleme mit der Arbeit mit ParsedResults . Ich muss in der Lage sein, über verschachtelte Token in der Reihenfolge zu iterieren, dass sie gefunden werden, und ich finde es ein wenig frustrierend. Ich habe mein Problem auf einen einfachen Fall abstrahiert:

 import pyparsing as pp word = pp.Word(pp.alphas + ',.')('word*') direct_speech = pp.Suppress('“') + pp.Group(pp.OneOrMore(word))('direct_speech*') + pp.Suppress('”') sentence = pp.Group(pp.OneOrMore(word | direct_speech))('sentence') test_string = 'Lorem ipsum “dolor sit” amet, consectetur.' r = sentence.parseString(test_string) print r.asXML('div') print '' for name, item in r.sentence.items(): print name, item print '' for item in r.sentence: print item.getName(), item.asList() 

Soweit ich sehen kann, sollte das funktionieren Hier ist die Ausgabe:

 <div> <sentence> <word>Lorem</word> <word>ipsum</word> <direct_speech> <word>dolor</word> <word>sit</word> </direct_speech> <word>amet,</word> <word>consectetur.</word> </sentence> </div> word ['Lorem', 'ipsum', 'amet,', 'consectetur.'] direct_speech [['dolor', 'sit']] Traceback (most recent call last): File "./test.py", line 27, in <module> print item.getName(), item.asList() AttributeError: 'str' object has no attribute 'getName' 

Die XML-Ausgabe scheint zu zeigen, dass der String genau so geparkt wird, wie ich es wünschen würde, aber ich kann nicht über den Satz iterieren, zum Beispiel, um ihn zu rekonstruieren.

Gibt es eine Möglichkeit zu tun, was ich brauche?

Vielen Dank!

bearbeiten:

Ich habe das benutzt:

 for item in r.sentence: if isinstance(item, basestring): print item else: print item.getName(), item 

Aber es hilft mir nicht so viel, denn ich kann nicht unterscheiden verschiedene Arten von String. Hier ist ein leicht ausgedehntes Beispiel:

 word = pp.Word(pp.alphas + ',.')('word*') number = pp.Word(pp.nums + ',.')('number*') direct_speech = pp.Suppress('“') + pp.Group(pp.OneOrMore(word | number))('direct_speech*') + pp.Suppress('”') sentence = pp.Group(pp.OneOrMore(word | number | direct_speech))('sentence') test_string = 'Lorem 14 ipsum “dolor 22 sit” amet, consectetur.' r = sentence.parseString(test_string) for i, item in enumerate(r.sentence): if isinstance(item, basestring): print i, item else: print i, item.getName(), item 

Die Ausgabe ist:

 0 Lorem 1 14 2 ipsum 3 word ['dolor', '22', 'sit'] 4 amet, 5 consectetur. 

Nicht zu hilfreich Ich kann nicht zwischen word und number , und das direct_speech Element ist das word ?

Ich vermisse natürlich etwas. Alles was ich tun möchte ist:

 for item in r.sentence: if (item is a number): do something elif (item is a word): do something else etc. ... 

Soll ich das anders nähern?

2 Solutions collect form web for “`Pyparsing`: Iteration über` ParsedResults`”

r.sentence enthält eine Mischung aus Strings und ParseResults, und nur ParseResults unterstützt getName() . Hast du versucht, nur über den r.sentence ? Wenn ich es mit asList () ausdrucke, bekomme ich:

 ['Lorem', 'ipsum', ['dolor', 'sit'], 'amet,', 'consectetur.'] 

Oder dieses Snippet:

 for item in r.sentence: print type(item),item.asList() if isinstance(item,pp.ParseResults) else item 

Gibt:

 <type 'str'> Lorem <type 'str'> ipsum <class 'pyparsing.ParseResults'> ['dolor', 'sit'] <type 'str'> amet, <type 'str'> consectetur. 

Ich bin mir nicht sicher, ob ich Ihre Frage beantwortet habe, aber das macht ein Licht auf, wohin als nächstes?

(Willkommen bei Pyparsing)

Nun, ich habe eine Reihe von verschiedenen Ansätzen jetzt versucht und ich kann nicht bekommen, was ich brauche, also (absurd, obwohl es scheint), ich benutze .asXML() und analysiere das resultierende XML. Hier ist mein Beispiel:

 import pyparsing as pp word = pp.Word(pp.alphas + ',.')('word*') number = pp.Word(pp.nums + ',.')('number*') direct_speech = pp.Suppress('“') + pp.Group(pp.OneOrMore(word | number))('direct_speech*') + pp.Suppress('”') sentence = pp.Group(pp.OneOrMore(word | number | direct_speech))('sentence') test_string = 'Lorem 14 ipsum “dolor 22 sit” amet, consectetur.' r = sentence.parseString(test_string) from lxml import etree xml = etree.fromstring(r.sentence.asXML('sentence')) for el in xml: if len(el): print el.tag for sub_el in el: print ' ', sub_el.tag, ':', sub_el.text else: print el.tag, ':', el.text 

Welche Ausgänge:

 word : Lorem number : 14 word : ipsum direct_speech word : dolor number : 22 word : sit word : amet, word : consectetur. 

Scheint wie ein langer Weg um die Häuser, aber es scheint nicht besser zu sein.

  • PyParsing: Ist diese korrekte Verwendung von setParseAction ()?
  • Wie kann ich Einbuchtungen und Widder mit Pyparsing analysieren?
  • PyParsing Lookaheads und gierige Ausdrücke
  • Zugriff auf geparste Elemente mit Pyparsing
  • Pyparsing - wo die Reihenfolge der Token in unvorhersehbaren
  • Brauchen Sie Hilfe bei der Herstellung der rekursiven Parser mit pyparsing
  • Erstellen Sie einen einfachen Parser, der verschiedene Datumsformate mit PyParse analysieren kann
  • Python / Pyparsing - Multiline Zitate
  • Macht Pyparsing Unterstützung kontext-sensible Grammatiken?
  • Kontext in pyparsing parse Aktionen neben globals
  • Wie man Klammern / Klammern in pyparsing passt
  • Python ist die beste Programmiersprache der Welt.