Ich habe eine Textdatei, die ähnlich aussieht wie
Abschnittsüberschrift 1:
einige worte können alles sein mehr worte könnten alles sein usw. usw. lalaeine andere Kopfzeile:
wie vorher könnte alles sein Hey, ist das nicht Spaß
Ich versuche, eine Grammatik mit Pyparser zu konstruieren, die zu der folgenden Listenstruktur führen würde, wenn man nach den geparsten Ergebnissen als Liste fragt; (IE; Folgendes sollte gedruckt werden, wenn die Elemente parsed.asList () durchlaufen werden)
['section header 1:', [[einige Wörter können alles sein]], ['mehr Wörter könnten überhaupt etwas sein'], ['etc etc lala']]]] ['irgend ein anderer Header:', [['wie vorher könnte alles sein'], ['hey isnt this fun']]]]
Die Kopfzeilennamen sind alle vorher bekannt, und einzelne Kopfzeilen können erscheinen oder nicht. Wenn sie erscheinen, ist thre immer mindestens eine Zeile Inhalt.
Das Problem, das ich habe, ist, dass ich Probleme habe, den Parser zu erkennen, wo 'Abschnittsüberschrift 1:' unds, und 'irgendeine andere Überschrift:' beginnt. Ich habe am Ende eine parsed.asList () wie folgt aussehen;
['section header 1:', [['' einige Wörter können alles sein '], [' mehr Wörter könnten überhaupt etwas sein '], [' etc etc lala '], [' einige andere Kopfzeilen '] , "Wie vorher konnte alles sein", ["Hey, ist das nicht lustig"]]]
(IE: Abschnittskopf 1: wird richtig gesehen, aber jeder nachfolgende Text wird zum Abschnittskopf 1 hinzugefügt, einschließlich weiterer Kopfzeilen usw.)
Ich habe verschiedene Dinge ausprobiert, mit leaveWhitespace () und LineEnd () auf verschiedene Arten gespielt, aber ich kann es nicht herausfinden.
Der Basis-Parser, mit dem ich herumhacke, ist (konstruiertes Beispiel - in Wirklichkeit ist dies eine Klassendefinition usw.).
%Vor%und wird mit
aufgerufen %Vor%Prost, Matt.
Matt -
Willkommen bei pyparsing! Sie sind in eine der häufigsten Fallstricke bei der Arbeit mit Pyapsing geraten, und das ist, dass Menschen schlauer sind als Computer. Wenn Sie sich Ihren Eingabetext ansehen, können Sie leicht erkennen, welcher Text Header sein kann und welcher nicht. Unglücklicherweise ist Pyparsen nicht so intuitiv, also musst du es ausdrücklich sagen was Text sein kann und was nicht.
Wenn Sie sich Ihren Beispieltext ansehen, akzeptieren Sie nicht nur eine Textzeile als möglichen Text innerhalb einer Abschnittsüberschrift. Woher weißt du, dass 'ein anderer Header:' nicht als Text gültig ist? Weil Sie wissen, dass diese Zeichenfolge mit einer der bekannten Header-Zeichenfolgen übereinstimmt. Aber in Ihrem aktuellen Code haben Sie pyparsing gesagt, dass jede Sammlung von Word(printables)
gültiger Text ist, selbst wenn diese Auflistung eine gültige Abschnittsüberschrift ist .
Um dies zu beheben, müssen Sie Ihrem Parser einen expliziten Lookahead hinzufügen. Pyparsing bietet zwei Konstrukte, NotAny und FollowedBy. NotAny kann mit dem Operator '~' abgekürzt werden, sodass wir diesen Pseudocode-Ausdruck für Text schreiben können:
%Vor%Hier ist ein vollständiger Parser mit negativem Lookahead, um sicherzustellen, dass Sie jeden Abschnitt lesen und dabei die Abschnittsüberschriften durchbrechen:
%Vor%Bei meinem ersten Versuch habe ich vergessen, auch nach dem Ende der Zeichenfolge zu suchen, sodass mein RestOfLine-Ausdruck für immer geloopt wird. Durch Hinzufügen eines zweiten Lookahead für das Ende der Zeichenfolge wird mein Programm erfolgreich beendet. Übung links für Sie: Anstatt alle möglichen Überschriften aufzuzählen, definieren Sie eine Kopfzeile als jede Zeile, die mit einem ':' endet.
Viel Glück mit deinen Pippers Bemühungen, - Paul