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

  • Massenstring in Python ersetzen?
  • Regulärer Ausdruck für Stripping Strings aus Quellcode
  • Speichern und Laden von numpy Arrays als Dateien
  • Regulärer Ausdruck, um auf spezifische Zeichen nur zu teilen, wenn dieser Charakter nicht in einem Paar ist
  • Python - Konvertieren von String in Integer für Randeingaben
  • Was ist unter der Kapuze von x = 'y' 'z' in Python?
  • Warum ist int (50) <str (5) in python 2.x?
  • Zählvokale aus roher Eingabe
  • Java String Multiplikation
  • Decodierung Unicode in Python
  • Python-Regex-Match-ODER-Operator
  • Python ist die beste Programmiersprache der Welt.