problem mit pyparsing

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
darkfrog
User
Beiträge: 26
Registriert: Mittwoch 19. Juli 2006, 16:19

problem mit pyparsing

Beitragvon darkfrog » Montag 28. Mai 2007, 18:01

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
BlackJack

Beitragvon BlackJack » Montag 28. Mai 2007, 19:21

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.
darkfrog
User
Beiträge: 26
Registriert: Mittwoch 19. Juli 2006, 16:19

Beitragvon darkfrog » Dienstag 29. Mai 2007, 17:27

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?
BlackJack

Beitragvon BlackJack » Dienstag 29. Mai 2007, 18:29

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.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Mittwoch 30. Mai 2007, 19:27

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder