Nicht finden die Saiten erwartet mit pyparsing

Ich versuche, einen String mit pyparsing zu analysieren. Verwenden Sie den unten stehenden Code

import pyparsing as pyp aString = "C((H2)(C(H3))) C((H1)(Cl1)) C(((C(H3))3))" aSub = '(('+ pyp.Word('()'+pyp.srange('[A-Za-z0-9]'))+'))' substituent = aSub('sub') for t,s,e in substituent.scanString(aString): print t.sub 

Ich bekomme keine Ausgabe. aString = "C((H2)(C(H3))) C((H1)(Cl1)) C(((C(H3))3))" Es gibt mehrere Vorkommen von ((stuff)) ((H2)(C(H3))) C((H1)(Cl1)) ((H2)(C(H3))) , C((H1)(Cl1)) & C((H1)(Cl1)) und C(((C(H3))3)) C((H1)(Cl1)) & C((H1)(Cl1)) C(((C(H3))3)) .

Mein Verständnis von Word() war, dass die Eingabe (im Falle eines einzelnen Inputs, wie ich), alle möglichen Charakterkombinationen repräsentiert, die erfolgreich ein Match zurückgibt.

Den Code ausführen

 import pyparsing as pyp aString = "C((H2)(C(H3))) C((H1)(Cl1)) C(((C(H3))3))" aSub = '(' + pyp.Word(pyp.srange('[A-Za-z0-9]'))+')' substituent = aSub('sub') for t,s,e in substituent.scanString(aString): print t.sub 

Gibt eine Ausgabe von

 ['(', 'H2', ')'] ['(', 'H3', ')'] ['(', 'H1', ')'] ['(', 'Cl1', ')'] ['(', 'H3', ')'] 

Alles, was ich geändert habe, ist ein zusätzlicher externer Satz von Klammern, sowie die Option der Klammern innerhalb der Zeichenfolge, die die gewünschten Zeichenfolgen haben. Ich bin mir nicht sicher, warum das erste Programm mir nichts gibt, während die zweite Saite mir (ein Teil) gibt, was ich will.

2 Solutions collect form web for “Nicht finden die Saiten erwartet mit pyparsing”

Das Problem ist die pyparsing Werke links nach rechts ( Quelle ). Also die richtige Klammer löscht, was du auf der rechten Seite suchst. Zum Beispiel:

 aSub = '(('+ pyp.Word('()'+pyp.srange('[A-Za-z0-9]')) 

kehrt zurück

 ['((', 'H2)(C(H3)))'] ['((', 'H1)(Cl1))'] ['((', '(C(H3))3))'] 

Wie in den Kommentaren von Paul McGuire vorgeschlagen, fand ich, dass mit nestedExpr war die beste Wahl für meine Situation. Mit dem folgenden Code

 import pyparsing as pyp aString = "C((H2)(C(H3))) C((H1)(Cl1)) C((C(H3))3)" aList = aString.split() for i in range(len(aList)): aList[i] = [pyp.nestedExpr().parseString(aList[i][1:]).asList()[0]] print aList 

Ich habe eine Ausgabe von

 [[[['H2'], ['C', ['H3']]]], [[['H1'], ['Cl1']]], [[['C', ['H3']], '3']]] 

Das ist genau das, was ich wollte

  • Alternative zur python-String-Itemzuweisung
  • Python-Partition und Split
  • Mehrfache Zeichen ersetzen mit Python
  • Lange <-> str binäre Konvertierung
  • Überprüfen Sie auf Duplikate in einer flachen Liste
  • Überprüfen Sie, ob ein String keine Mehrfachwerte enthält
  • Warum ist str.translate schneller in Python 3.5 im Vergleich zu Python 3.4?
  • String to Wörterbuch in Python
  • Zählerscheinen von mehreren Teilstrings in einer Zelle Pandas
  • UnicodeEncodeError mit xlrd
  • Singular und Plural Phrase Matching in Pandas
  • Python ist die beste Programmiersprache der Welt.