Positiv- und Negativ-Lookahead in Python Regex
Manchmal steht man vor einer Aufgabe dieser Art:
finde den String 'aaa' und ersetze ihn
durch '!', aber nur wenn nach
'aaa' ein 'x' folgt, wobei
das 'x' selbst nicht ersetzt werden soll. Wenn wir versuchen,
die Aufgabe 'direkt' zu lösen,
wird es nicht gelingen:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # gibt '! baaa' aus, aber gewünscht war '!x baaa'
Lookahead
Um die Aufgabe zu lösen, brauchen wir eine Möglichkeit zu sagen,
dass das 'x' nicht ersetzt werden soll. Dies wird
mit Hilfe spezieller Klammern (?= ) erreicht,
die nur prüfen, aber nicht mit aufnehmen.
Diese Klammern werden Positiv-Lookahead genannt.
Positiv - weil das 'x'
(in unserem Fall) vorhanden sein muss - nur dann
wird die Ersetzung durchgeführt.
Lassen Sie uns diese Klammern zur Lösung unserer Aufgabe anwenden:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # gibt '!x baaa' aus
Es gibt auch den Negativ-Lookahead
- (?! ) - dieser sagt im Gegensatz dazu,
dass etwas nicht vorhanden sein darf. Im folgenden
Beispiel wird die Ersetzung nur durchgeführt, wenn
nach 'aaa' KEIN 'x' folgt:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # gibt 'aaax !b' aus
Lookbehind
Analog dazu gibt es den Positiv-Lookbehind
- (?<= ). Im
folgenden Beispiel wird die Ersetzung nur durchgeführt, wenn
vor 'aaa' ein 'x' steht:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # gibt 'x!' aus
Und es gibt auch den Negativ-Lookbehind
- (?<! ). Im folgenden Beispiel
wird die Ersetzung nur durchgeführt, wenn vor
'aaa' kein 'x' steht:
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # gibt 'b!' aus
Praktische Aufgaben
Gegeben ist ein String, der Funktionsnamen enthält:
txt = 'func1() func2() func3()'
Erhalten Sie ein Array der Funktionsnamen aus dem String.
Gegeben ist ein String mit einem Tag:
txt = '<a href="" class="eee" id="zzz">'
Erhalten Sie ein Array der Attributnamen dieses Tags.
Gegeben ist ein String mit Variablen:
txt = '$aaa $bbb $ccc xxxx'
Erhalten Sie die Teilzeichenfolgen, denen ein Dollar-Zeichen vorausgeht.