Gierbegrenzung in Regex in Python
Reguläre Ausdrücke sind standardmäßig gierig. Das bedeutet, dass sie die maximal mögliche Anzahl an Zeichen erfassen. Lassen Sie uns das an einem Beispiel untersuchen. Angenommen, wir haben folgende Zeichenkette:
txt = 'aeeex zzz x kkk'
In dieser Zeichenkette möchten wir die Teilzeichenkette
'aeeex' nach folgendem Muster finden:
Buchstabe 'a', dann ein beliebiges Zeichen
ein- oder mehrmals, dann Buchstabe 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Obwohl wir die Zeichenkette '! zzz
x kkk' erhalten möchten, wird die Zeichenkette '! kkk' ausgegeben.
Der Grund liegt darin, dass unser Regex-Ausdruck
alle Zeichen vom Buchstaben 'a' bis zum Buchstaben
'x' sucht. Aber in unserer Zeichenkette gibt es zwei Buchstaben
'x'! Aufgrund der Gier stellt sich heraus, dass
der Regex-Ausdruck bis zum letzten 'x' sucht,
wodurch er nicht das erfasst, was wir
brauchten.
Natürlich ist dieses Verhalten oft genau das, was wir brauchen. Aber in diesem speziellen Fall müssen wir die Gier deaktivieren und dem Regex-Ausdruck mitteilen, dass er bis zum ersten 'x' suchen soll. In diesem Fall sollte nach dem Wiederholungsoperator ein Fragezeichen gesetzt werden:
res = re.sub('a.+?x', '!', txt)
print(res) # gibt die Zeichenkette '! zzz x kkk' aus
Die Gier kann bei allen Wiederholungsoperatoren
eingeschränkt werden: sowohl bei *, als auch bei ?, und
{} - so: *?, ??
und {}?.
Gegeben sei die Zeichenkette:
txt = 'aba accca azzza wwwwa'
Schreiben Sie einen Regex-Ausdruck, der alle
Zeichenketten findet, an deren Rändern die Buchstaben
'a' stehen, und jede davon durch
'!' ersetzt. Zwischen den Buchstaben 'a' kann
ein beliebiges Zeichen stehen (außer 'a').