Beperking van hebzucht in regex in Python
Reguliere expressies zijn standaard hebzuchtig. Dit betekent dat ze de maximaal mogelijke hoeveelheid tekens vastleggen. Laten we dit bekijken aan de hand van een voorbeeld. Stel dat we de volgende string hebben:
txt = 'aeeex zzz x kkk'
In deze string willen we de substring
'aeeex' vinden volgens het volgende patroon:
letter 'a', dan elk teken
een of meer keer, dan letter 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Hoewel we de string '! zzz
x kkk' willen krijgen, wordt de string '! kkk' uitgevoerd.
De reden is dat onze regex zoekt naar
alle tekens van letter 'a' tot letter
'x'. Maar in onze string staan twee letters
'x'! Door de hebzucht gebeurt het dat
de regex zoekt tot de allerlaatste x,
waardoor hij meer vastlegt dan we nodig hadden.
Natuurlijk is dit gedrag vaak ook wat we nodig hebben. Maar specifiek in dit geval moeten we de hebzucht uitschakelen en de regex vertellen dat hij moet zoeken tot de eerste x. In dit geval moeten we een vraagteken plaatsen na de herhalingsoperator:
res = re.sub('a.+?x', '!', txt)
print(res) # geeft de string '! zzz x kkk' weer
Hebzucht kan worden beperkt voor alle herhalingsoperatoren:
zowel *, als ?, als
{} - zoals dit: *?, ??
en {}?.
Gegeven de string:
txt = 'aba accca azzza wwwwa'
Schrijf een regex die alle
strings vindt waar aan de randen de letters
'a' staan, en vervang elk ervan door
'!'. Tussen de letters 'a' kan
elk teken staan (behalve 'a').