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:

Code: Alles auswählen

XXX Das bleibt... 

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

Code: Alles auswählen

def sub(pattern, repl, string, count=0, flags=0):
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