2010-11-20 6 views
1

Ich versuche, eine einheitliche Diff-Datei mit Pyparssing als Übung zu analysieren und ich kann etwas nicht richtig machen. Hier ist der Teil meiner Diff-Datei, die mich verursacht plagt:Ein Leerzeichen am Anfang einer Zeile mit pyparsing

(... some stuff over...) 
banana 
+apple 
orange 

Die erste Zeile beginnt mit „“ und dann „Banane“. Ich habe folgenden Ausdruck eine Linie für die Analyse:

linestart = Literal(" ") | Literal("+") | Literal("-") 
line = linestart.leaveWhitespace() + restOfLine 

Dies funktioniert, wenn nur eine einzige Zeile Parsen, aber wenn ich versuche, die ganze Datei zu analysieren, die „leaveWhitespace“ Anweisung macht den Parser Start am Ende der letzten Linie. In meinem Beispiel, nach dem Parsen von "banana", ist das nächste Zeichen "\ n" (wegen leaveWhitespace) und der Parser versucht, "" oder "+" oder "-" zu finden und löst somit einen Fehler aus.

Wie kann ich das richtig handhaben?

+0

Wer Hausaufgaben auf pyparsing gibt angeben ?! – PaulMcG

+0

Ich d. H. Das ist keine Hausaufgabe, ich will nur Pips lernen. – subb

+0

Bitte besuchen Sie das Wiki unter http://pyparsing.wikispaces.com. Dort finden Sie Links zu Online-Dokumenten und Artikeln. Und zögern Sie nicht, Fragen auf der Registerkarte "Diskussion" der Wiki-Homepage zu stellen. Willkommen bei PYPARSING! – PaulMcG

Antwort

1

Sie können jeweils eine Zeile lesen und analysieren. Der folgende Code funktioniert für mich.

from pyparsing import Literal, restOfLine 

linestart = Literal(" ") | Literal("+") | Literal("-") 
line = linestart.leaveWhitespace() + restOfLine 

f = open("/tmp/test.diff") 
for l in f.readlines(): 
    fields = line.parseString(l) 
    print fields 

Und der Ausgang ist

[' ', 'banana'] 
['+', 'apple'] 
[' ', 'orange'] 

Oder wenn Sie mehrere Zeilen zu analysieren haben, können Sie explizit die LineEnd

linestart = Literal(" ") | Literal("+") | Literal("-") 
line = linestart.leaveWhitespace() + restOfLine + LineEnd() 
lines = ZeroOrMore(line) 
lines.parseString(f.read()) 
+0

Ja, das funktioniert, aber das Problem ist, dass ich einen Haufen anderer Parser für andere Teile der Datei habe. Ich gebe zu, dass mein Beispiel etwas vereinfacht wurde. Ich werde dem ursprünglichen Beitrag einige Details hinzufügen. – subb

+0

Sie sollten immer noch in der Lage sein, eine Zeile mit anderen Dingen in der Datei zu analysieren. Aber ich habe meine Antwort aktualisiert, um eine Möglichkeit zu finden, die gesamte Datei als String zu analysieren. Ich muss sagen, ich bin neu im Pyapsing und bin mir nicht sicher, ob es die beste Übung ist. –