Seite 1 von 1
Probleme mit re - Modul
Verfasst: Freitag 12. April 2013, 16:59
von sedi
Hallo,
ich komm nicht auf die Lösung:
Wie erreiche ich, das alles zwischen den Tags '{% comment %}' und '{% end comment %}'
inklusive der Tags entfernt wird?
Ein paar meiner Versuche:
Beispiel 1:
Code: Alles auswählen
t = u""".. {% comment %}
Das ist 'n bischn Text...
{% end comment %} Das bleibt..."""
print re.sub(u"^.. {% comment %}.*{% end comment %}",
u"XXX",
t,
re.M | re.S | re.U)
mit folgender unerwünschter Ausgabe:
.. {% comment %}
Das ist 'n bischn Text...
{% end comment %} Das bleibt...
Beispiel 2: lieferte gleiches Ergebnis
Code: Alles auswählen
print re.sub(u"^\.\. \{% comment %\}.*\{% end comment %\}",
u"XXX",
t,
re.M | re.S | re.U)
Bei einzeiliger Eingabe...
Code: Alles auswählen
t = u"{% comment %} $MAXIMALPUNKTZAHL ??? {% end comment %} Das bleibt... "
print re.sub(u"^.. {% comment %}.*{% end comment %}",
u"XXX",
t,
re.M | re.S | re.U)
habe ich das Gewünschte erhalten:
Re: Probleme mit re - Modul
Verfasst: Freitag 12. April 2013, 17:18
von kbr
Mal so auf die Schnelle und ohne großen Test, geht vielleicht auch besser:
Code: Alles auswählen
import re
t = u""".. {% comment %}
Das ist 'n bischn Text...
{% end comment %} Das bleibt..."""
print re.sub(r'{%.*?%}', '', t)
Re: Probleme mit re - Modul
Verfasst: Freitag 12. April 2013, 17:28
von sedi
Danke @kbr,
aber bei Kommentaren mit %} problematisch oder? (ebenfalls aus der Hüfte geschossen).
Beispiel:
t = u""".. {% comment %}
Das ist 'n bischn Text...
Das ist 'n bischn Text mit dem folgenden Unsinn {%}...
{% end comment %} Das bleibt..."""
Durch die Tags '{% comment %}' und '{% end comment %}' soll vermieden werden, dass man bei Kommentaren auf Zeichendetails achten muss!
Re: Probleme mit re - Modul
Verfasst: Freitag 12. April 2013, 17:56
von sedi
Ich habe jetzt mal selber versucht dem Problem systematisch beizukommen, leider immer noch nicht schlauer:
Code: Alles auswählen
import sys
import re
Pattern_to_test = [
r"^\.\. \{% comment %\}.*\{% end comment %\}",
r"^.. {% comment %}.*{% end comment %}",
u"^\.\. \{% comment %\}.*\{% end comment %\}",
u"^.. {% comment %}.*{% end comment %}",
]
flagkombis = [
re.M,
re.S,
re.U,
re.M | re.S,
re.M | re.U,
re.S | re.U,
re.M | re.S | re.U,
]
one = u".. {% comment %} $MAXIMALPUNKTZAHL {% end comment %} Das bleibt... "
def check_one():
treffer_one = []
for p in Pattern_to_test:
for i, f in enumerate(flagkombis):
if re.sub(p, u"XXX", one, f) != one:
treffer_one.append( (p, i) )
if treffer_one:
print "Treffer bei Einzeilern:"
print "======================"
for t in treffer_one:
print "Pattern: %s; Flagkombi: %s" % t
else:
print "Nichts funktioniert :("
many = u""".. {% comment %}
Das ist 'n bischn Text...
{% end comment %} Das bleibt..."""
def check_many():
treffer_many = []
for p in Pattern_to_test:
for i, f in enumerate(flagkombis):
if re.sub(p, u"XXX", many, f) != many:
treffer_many.append( (p, i) )
if treffer_many:
print "Treffer bei Mehrzeilern:"
print "========================"
for t in treffer_many:
print "Pattern: %s; Flagkombi: %s" % t
else:
print "Nichts funktioniert :("
#~ check_one()
check_many()
Die Funktion ``check_one()`` gibt ne Menge Treffer aus, aber die Funktion ``check_many()`` bleibt stumm

Re: Probleme mit re - Modul
Verfasst: Freitag 12. April 2013, 18:00
von Sirius3
Die Definition von »re.sub« ist
Das heißt, Deine Flags hast Du immer als count angegeben.
Re: Probleme mit re - Modul
Verfasst: Freitag 12. April 2013, 19:06
von sedi
Danke @Sirius3
ich kann nur sagen: manchmal steht man echt auf der Leitung... - peinlich
Re: Probleme mit re - Modul
Verfasst: Samstag 13. April 2013, 00:03
von Sirius3
um ehrlich zu sein, ich habe Dein Problem auch erst gelesen, mich gewundert und zehn Minuten später nochmal draufgeschaut, mich dunkel an etwas erinnert.
Was bedeuten eigentlich die zwei Punkte vor dem Kommentar?
In diesem Fall besser und ohne Stolperstein:
Code: Alles auswählen
MATCH_COMMENT = re.compile("{% comment %}.*?{% end comment %}", re.M | re.S)
MATCH_COMMENT.sub("xxx",t)
Man beachte das ».*?«, um nicht den ersten mit dem letzten Kommentar in einem Text miteinander zu verbinden.
Re: Probleme mit re - Modul
Verfasst: Samstag 13. April 2013, 09:24
von sedi
Hallo @Sirius3,
ich habe ein paar Templates in restructured Text (
ResT) bzw in
Sphinx erstellt. In diesen Vorlagen sollen Informationen eingearbeitet werden können, die vom Templatesystem ausgewertet werden. Werden aber die Auswertungen nicht vorgenommen, kann es sein, dass der Teil im Dokument verbleibt und in kompletter Form an
Sphinx übergeben wird. Damit das im Ausgabedokument ohne Folgen bleibt habe ich die beiden führenden Punkte verwendet, welche in ReST ja einen Kommentar einleiten.
Code: Alles auswählen
.. {% comment %}
Alles was hier steht wird von Sphinx und von (Django-)Templates als Kommentar verstanden
{% end comment %}
Ich habe das Pattern jetzt mal wie folgt gesetzt:
Code: Alles auswählen
import re
pattern = r"^ *\.\. \{% comment %\}.*?\{% comment %\}"
flags = re.S | re.M | re.U