Seite 1 von 1

problem mit pyparsing

Verfasst: Montag 28. Mai 2007, 18:01
von darkfrog
Ich habe ein kleines Problem mit PyParsing.
Ich habe einen Text, in welchem folgende Struktur vorkommt:

...
# Test 1 hsgd hsgst nsju
# Test 2 jdh ndzh ndh
...

Also mehrere Linien hintereinander beginnen mit # und auf diese folgt Text. Diese Struktur soll erkannt, und am Anfang und Ende mit Strings (Anfang{, }Ende) ergänzt werden.

...
Anfang{
# Test 1 hsgd hsgst nsju
# Test 2 jdh ndzh ndh
}Ende
...

Mein Versuch mit OneOrMore(Literal("#") + SkipTo(LineEnd)), liefert diese Zeilen auch, wenn ich nun aber Strings dazu "addieren" will, wird dies in jeder Zeile gemacht und nicht nur am Anfang oder Ende.

Schon im Vorraus danke für Hilfe,

Lorenz

Verfasst: Montag 28. Mai 2007, 19:21
von BlackJack
Das sind zuwenig Informationen. Wie parst Du den Text? Was ist mit Text ausserhalb dieser Zeilen? Wie führst Du die Ersetzung durch? Kannst Du ein minimales, ausführbares Beispiel zeigen?

Ich nehme mal an, es geht nicht nur um diese Veränderung, denn dann wäre PyParsing ein wenig Overkill.

Verfasst: Dienstag 29. Mai 2007, 17:27
von darkfrog
Sorry, hatte bloß den Code nicht auf diesem Computer. Jetzt bin ich am richtigen. :wink:

Es geht darum, dass ich MediaWiki-Code in Latex transformieren möchte. In diesem Code kommen Listen in der Form # oder * und dann Text bis zum Zeilenende:

# Test 1 hsgd hsgst nsju
# Test 2 jdh ndzh ndh

Dies möchte ich in Latexform bringen:

\begin{enumerate}
\item Test 1 hsgd hsgst nsju
\item Test 2 jdh ndzh ndh
\end{enumerate}

Mein momentaner Stand ist so:

Code: Alles auswählen

num_list = Combine(OneOrMore(Literal("#") + SkipTo(LineEnd()))).setParseAction(lambda s,l,t: ["\\begin{enumerate}" + t[0] + "\\end{enumerate}"])
Dies führt aber zu folgender Ausgabe:

\begin{enumerate} # Test 1 hsgd hsgst nsju \end{enumerate}
\begin{enumerate} # Test 2 jdh ndzh ndh \end{enumerate}

(Die Ersetzung von # nach \item erfolgt extra)
Wie schaffe iches , dass ich an den ganzen Listenblock vorne und hinten die Strings anfügen kann?

Verfasst: Dienstag 29. Mai 2007, 18:29
von BlackJack
Hm, mit `parseActions()` habe ich noch nicht besonders viel gemacht. Die Token beim Parsen zu verändern fand ich nicht besonders sauber. Wenn ich `pyparsing` verwendet habe, dann immer um erst einmal einen Syntaxbaum aufzubauen und den dann weiter zu verarbeiten.

Verfasst: Mittwoch 30. Mai 2007, 19:27
von Joghurt
Warum nicht einfach so:

Code: Alles auswählen

buffer=[]
for line in EINGABE:
    if line.startswith('#'):
        buffer.append(line)
        continue
    if len(buffer)>0:
        print "begin"
        print "".join(buffer)
        print "end"
        buffer = []
    else:
        print line, 
line.startswith ggf. durch line.strip().startswith ersetzen