Seite 1 von 1
regex lookbehind
Verfasst: Dienstag 28. April 2015, 08:04
von Boa
Hallo,
Wieso wird bei folgendem Ausdruck Welt nicht mit XXX ersetzt? Der Ausdruck ist auf mein Verständnis Problem vereinfacht, macht also nicht mehr direkt Sinn.
Code: Alles auswählen
re.sub(r",'(?!')(.*?)(?<!')',",r",'XXX',","1,2,3,4,5,6,'Hallo','Welt'")
AUSDRUCK1(?!AUSDRUCK2) sucht nach AUSDRUCK1 nicht gefolgt von AUSDRUCK2.
(?<!AUSDRUCK2)AUSDRUCK1 sucht nach AUSDRUCK1 ohne AUSDRUCK2 davor.
[EDIT:Beispiel korrigiert; Regex matched Komma am Ende des Strings.]
Code: Alles auswählen
re.sub(r",'(?!')(.*?)(?<!')',",r",'XXX',","1,2,3,4,5,6,'Hallo','Welt',7")
Boa
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 08:16
von Sirius3
@Boa: wieviele Kommas kommen nach Welt' und wieviele zwischen Hallo und Welt? Und was soll der Quatsch mit Look-Ahead, wenn Du danach sowieso ein Anführungszeichen matchst? Und versuchst Du da gerade CSV-Dateien mit regulären Ausdrücken zu bearbeiten? Das geht im Allgemeinen schief. Dafür gibt es das csv-Modul.
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 08:31
von Boa
@Sirius: Falls die Frage ernst gemeint ist: Nach Welt kommt kein Komma und zwischen den beiden Wörtern steht ein Komma. Wie gesagt, das ist ein vereinfachtes Beispiel. Ich habe bereits einen Regex für mein Problem gefunden, jedoch habe ich nicht verstanden warum mein erster Versuch nicht funktionierte. Ich hatte das Problem auf den Ausdruck vereinfacht, auch wenn er nun keinen "Sinn" mehr macht. Es geht leider nicht um CSV.
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 08:36
von Boa
@Sirius: Falls du mein eigentliches Vorhaben wissen möchtest; das war alle Strings zu ersetzen, die mit _einem_ Hochkomma anfangen und mit _einem_ Hochkomma aufhören. Daher hatte ich im originalen Regex um das Hochkomma jeweils einen negativen Lookbehind/-ahead um mehrfache Hochkommas auszuschließen.
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 08:54
von Sirius3
@Boa: Die Frage war gemeint, dass Du selbst draufkommst, wo wann welche Kommas verarbeitet werden. Und so komplizierte reguläre Ausdrücke sind im Allgemeinen so schwer zu prüfen, ob sie tatsächlich genau das Beabsichtigte machen, dass es oft besser ist, sich einen kleinen Parser zu schreiben.
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 09:36
von Boa
Oha, ich hatte ich mein Beispiel falsch gewählt. Ich passe es noch Mal an.
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 09:56
von Sirius3
@Boa: ich denke, Du hast Dein Beispiel nicht falsch gewählt aber gezeigt, dass schwierig ist, mit regulären Ausdrücken alle Fälle abzudecken. Wenn Du durch meine Frage immer noch nicht auf die Lösung gekommen bist, dann wäre ich an Deiner Stelle mit regulären Ausdrücken vorsichtiger.
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 10:29
von Boa
@Sirius: Nein, deine Antwort hat mich nicht auf die Antwort gebracht. Schade, dass du mir die Antwort nicht direkt sagen willst, aber da es nicht so dringend ist, da ich das eigentliche Problem schon gelöst habe kann ich mir Zeit lassen. Vielleicht komme ich selbst darauf. Ich verstehe nicht ganz was du damit meinst, dass ich vorichtiger sein soll. Du brauchst dir keine Sorgen machen, ich bringe mit dem Skript dass ich gerade programmiere niemanden in Gefahr.
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 10:43
von Sirius3
@Boa: 'ababa'.replace('aba','axa') ist im Prinzip das selbe Problem.
Re: regex lookbehind
Verfasst: Dienstag 28. April 2015, 10:49
von Boa
Ah, danke
Das letzte Komma wird logischer Weise bei dem ersten Match mit aufgebraucht. Es ist ja nicht im Lookahead Buffer drin.