regex und greedy

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
mleopold
User
Beiträge: 15
Registriert: Dienstag 4. Juni 2013, 16:05

Hallo zusammen,

ich möchte die ersten gleichen Zeichen eines string ersetzen. Der Code ist der folgende:

Code: Alles auswählen

import re
print(re.sub('^(@+)', '+'*len(r'\1'), '@@@@@abc'))
Ich würde nun als Ergebnis +++++abc erwarten. Begründung: Das + ist greedy und sollte darum alle @ am Anfang des strings "abfassen".

Tatsächlich kommt aber (unter python 3.7.3) ++abc heraus. Woran liegt das?

Danke schon mal
mleopold
User
Beiträge: 15
Registriert: Dienstag 4. Juni 2013, 16:05

Denkfehler. Man muss es einmal richtig hinschreiben. len(r'\1') ist 2 weil \ und 1.

Wie muss es richtig heißen?
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Der Raw-String r"\1" besteht nun mal aus zwei Zeichen. Es ist aber schon klar, dass du die Gruppe referenzieren willst. Das geht aber nur innerhalb des Regex-Patterns. len() weiß nichts von regulären Ausdrücken, und schon gar nicht werden irgendwelche Abfragen für andere Funktionen zwischengespeichert...
mleopold
User
Beiträge: 15
Registriert: Dienstag 4. Juni 2013, 16:05

Danke. Da war ich brettig. Habe es nun zerlegt.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Man kann `re.sub()` auch eine Funktion als zweites Argument übergeben die das Match-Objekt als Argument bekommt:

Code: Alles auswählen

In [157]: re.sub("^(@+)", lambda match: "+" * len(match.group(1)), "@@@@@abc")  
Out[157]: '+++++abc'
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
mleopold
User
Beiträge: 15
Registriert: Dienstag 4. Juni 2013, 16:05

Ein sehr guter Hinweis, Danke!
Antworten