Positieve en negatieve lookahead en lookbehind in Python regex
Soms moet je een taak van dit type oplossen:
zoek de string 'aaa' en vervang deze
door '!', maar alleen als na
'aaa' een 'x' staat, en
de 'x' zelf niet vervangen. Als we
de taak 'rechttoe rechtaan' proberen
op te lossen, zal het ons niet lukken:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # geeft '! baaa' uit, maar we wilden '!x baaa'
Lookahead
Om de taak op te lossen, is een manier nodig om te zeggen
dat 'x' niet vervangen moet worden. Dit wordt
gedaan met speciale haakjes (?= ),
die alleen kijken, maar niet meenemen.
Deze haakjes worden positieve lookahead genoemd.
Positief - omdat 'x'
(in ons geval) aanwezig moet zijn - alleen dan
vindt vervanging plaats.
Laten we deze haakjes toepassen om onze taak op te lossen:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # geeft '!x aaab uit
Er is ook negatieve lookahead
- (?! ) - deze zegt juist
dat iets niet aanwezig moet zijn. In het volgende
voorbeeld vindt vervanging alleen plaats als
na 'aaa' GEEN 'x' staat:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # geeft 'aaax !b' uit
Lookbehind
Op vergelijkbare wijze is er positieve
lookbehind - (?<= ). In het
volgende voorbeeld vindt vervanging alleen plaats
als vóór 'aaa' een 'x' staat:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # geeft 'x!' uit
En er is ook negatieve lookbehind
- (?<! ). In het volgende voorbeeld
vindt vervanging alleen plaats als vóór
'aaa' geen 'x' staat:
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # geeft 'b!' uit
Praktische opdrachten
Gegeven een string die functienamen bevat:
txt = 'func1() func2() func3()'
Verkrijg een array van functienamen uit de string.
Gegeven een string met een tag:
txt = '<a href="" class="eee" id="zzz">'
Verkrijg een array van attribuutnamen van deze tag.
Gegeven een string met variabelen:
txt = '$aaa $bbb $ccc xxxx'
Verkrijg de substrings die worden voorafgegaan door een dollarteken.