Begrænsning af grådighed i regulære udtryk i Python
Regulære udtryk er som standard grådige. Det betyder, at de fanger det maksimalt mulige antal tegn. Lad os se på et eksempel. Antag, at vi har følgende streng:
txt = 'aeeex zzz x kkk'
I denne streng ønsker vi at finde delstrengen
'aeeex' ved hjælp af følgende mønster:
bogstavet 'a', derefter ethvert tegn
en eller flere gange, derefter bogstavet 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Selvom vi ønsker at få strengen '! zzz
x kkk', vil strengen '! kkk' blive udskrevet.
Årsagen er, at vores regulære udtryk søger
alle tegn fra bogstavet 'a' til bogstavet
'x'. Men i vores streng er der to bogstaver
'x'! På grund af grådigheden resulterer det i,
at det regulære udtryk søger til den aller sidste x,
herved fanger den ikke det, vi havde brug for.
Selvfølgelig er denne opførsel ofte det, vi har brug for. Men lige i dette tilfælde er vi nødt til at ophæve grådigheden og fortælle det regulære udtryk, at det skal søge til den første x. I dette tilfælde skal du sætte et spørgsmålstegn efter gentagelsesoperatoren:
res = re.sub('a.+?x', '!', txt)
print(res) # vil udskrive strengen '! zzz x kkk'
Grådighed kan begrænses for alle gentagelsesoperatorer:
både *, ?, og
{} - sådan her: *?, ??
og {}?.
Givet strengen:
txt = 'aba accca azzza wwwwa'
Skriv et regulært udtryk, der finder alle
strenge, hvor bogstavet 'a' står i begge ender,
og erstatter hver af dem med
'!'. Mellem bogstaverne 'a' kan der
være ethvert tegn (undtagen 'a').