Positiv og negativ lookahead i Python regulære udtryk
Sommetider skal man løse en opgave af denne type:
find strengen 'aaa' og erstat den
med '!', men kun hvis efter
'aaa' kommer 'x', mens
'x' selv ikke skal erstattes. Hvis vi
prøver at løse opgaven 'direkte',
vil det ikke lykkes:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # udskriver '! baaa', men ønskede var '!x baaa'
Lookahead
For at løse opgaven er der brug for en måde at sige,
at 'x' ikke skal erstattes. Dette gøres
ved hjælp af specielle parenteser (?= ),
der kun kigger, men ikke tager med sig.
Disse parenteser kaldes positiv lookahead.
Positiv - fordi 'x'
(i vores tilfælde) skal være til stede - kun så
vil erstatningen finde sted.
Lad os anvende disse parenteser til at løse vores opgave:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # udskriver '!x aaab
Der findes også negativ lookahead
- (?! ) - den siger, modsat,
at noget ikke skal være til stede. I det følgende
eksempel vil erstatning kun finde sted, hvis
der IKKE står 'x' efter 'aaa':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # udskriver 'aaax !b'
Lookbehind
På samme måde findes der positiv lookbehind
- (?<= ). I
følgende eksempel vil erstatning kun finde sted, hvis
der står 'x' foran 'aaa':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # udskriver 'x!'
Og der er også negativ lookbehind
- (?<! ). I følgende eksempel
vil erstatning kun finde sted, hvis der
IKKE står 'x' foran 'aaa':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # udskriver 'b!'
Praktiske opgaver
Der gives en streng, der indeholder funktionsnavne:
txt = 'func1() func2() func3()'
Få et array med funktionsnavnene fra strengen.
Der gives en streng med et tag:
txt = '<a href="" class="eee" id="zzz">'
Få et array med navnene på dette tags attributter.
Der gives en streng med variable:
txt = '$aaa $bbb $ccc xxxx'
Få delstrengene, der har dollartegnet foran sig.