regex lookbehind

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
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

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
Zuletzt geändert von Boa am Dienstag 28. April 2015, 09:39, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@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.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@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.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Oha, ich hatte ich mein Beispiel falsch gewählt. Ich passe es noch Mal an.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

@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.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Boa: 'ababa'.replace('aba','axa') ist im Prinzip das selbe Problem.
Boa
User
Beiträge: 190
Registriert: Sonntag 25. Januar 2009, 12:34

Ah, danke :)
Das letzte Komma wird logischer Weise bei dem ersten Match mit aufgebraucht. Es ist ja nicht im Lookahead Buffer drin.
Antworten