Probleme mit re - Modul

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.
Antworten
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

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... 
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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)
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

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!
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

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 :(
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

Danke @Sirius3

ich kann nur sagen: manchmal steht man echt auf der Leitung... - peinlich
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
sedi
User
Beiträge: 104
Registriert: Sonntag 9. Dezember 2007, 19:22

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
CU sedi
----------------------------------------------------------
Python 3.5; Python 3.6
LinuxMint18
Antworten