problem mit regex

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
blutigeranfaenger
User
Beiträge: 63
Registriert: Dienstag 4. März 2014, 12:04

Hallo zusammen,
ich habe ein Problem mit regular expressions.
Ich möchte das Wort 'es' zu 'dis' ersetzen, aber nur dann, wenn es am Anfang eines Wortes oder einer Zeile steht, aber nicht wenn es irgendwann nach einem %-Zeichen kommt.
Ich habe es mit folgendem Skript probiert:

Code: Alles auswählen

#!/usr/bin/env python3
from re import *
text = "es geht nicht, so geht es nicht, so geht es nicht weiter, essen wir lieber % es ist ein Kommentar"
#esString = compile("(?!%.*)[\s|\A]es(?!\w)") # das gibt leider eine Fehlermeldung
esString = compile("(?!%.*)\ses(?!\w)") 
ohnees = esString.sub(" dis",text)
print(ohnees)
Als Ergebnis kriege ich:

Code: Alles auswählen

es geht nicht, so geht dis nicht, so geht dis nicht weiter, essen wir lieber % dis ist ein Kommentar
Was kann ich tun, damit das Wort auch am Anfang einer Zeile bzw. eines Strings ersetzt wird und nicht ersetzt wird, wenn es nach einem %-Zeichen folgt?
Zuletzt geändert von Anonymous am Freitag 14. März 2014, 16:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@blutigeranfaenger: Als erstes mal würde ich das mit dem '%' extern lösen. Man muss nicht alles mit Gewalt in reguläre Ausdrücke pressen.

Sternchen-Importe sind Böse™. Und bei `re` echt albern um diese drei Zeichen beim Tippen zu sparen.
blutigeranfaenger
User
Beiträge: 63
Registriert: Dienstag 4. März 2014, 12:04

Hallo blackjack,
gibt es denn hier irgend einen sinnvollen Ersatz für die bösen Sternchenimporte?
BlackJack

@blutigeranfaenger: Ja, man kann Importe auch ohne Sternchen schreiben. Entweder das Modul importieren oder explizit mit ``from … import …`` die Namen importieren die man verwenden will. Bei `re` importiert man normalerweise einfach das Modul.
blutigeranfaenger
User
Beiträge: 63
Registriert: Dienstag 4. März 2014, 12:04

Ach das meinst Du!
Ich dachte du meintest die Zeile:

Code: Alles auswählen

esString = compile("(?!%.*)\ses(?!\w)") 
Ich habe also die Zeile

Code: Alles auswählen

from re import *
durch
import re
ersetzt.
Das gibt bei mir allerdings die Fehlermeldung

Code: Alles auswählen

File "nochmaleszudis.py", line 6, in <module>
    esString = compile("(?!%.*)\ses(?!\w)") 
TypeError: Required argument 'filename' (pos 2) not found
BlackJack

@blutigeranfaenger: Du versuchst die eingebaute `compile()`-Funktion für etwas zu verwenden wofür sie nicht gedacht ist. Du möchtest die `compile()`-Funktion aus dem `re`-Modul verwenden. Durch den Import hast Du nur den Namen `re` importiert und da ist das `re`-Modul dran gebunden. Die Namen auf Modulebene sind Attribute von diesem Modulobjekt auf die man über den Punktoperator zugreifen kann. Also beispielsweise ``all_re = re.compile(r'.*')``.
Antworten