Beperking van gierigheid in gereelde uitdrukkings in Python
Gereelde uitdrukkings is by verstek gierig. Dit beteken dat hulle die maksimum moontlike aantal karakters vang. Kom ons kyk na 'n voorbeeld. Gestel ons het die volgende string:
txt = 'aeeex zzz x kkk'
In hierdie string wil ons die substring
'aeeex' vind volgens die volgende patroon:
letter 'a', dan enige karakter
een of meer keer, dan letter 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Alhoewel ons die string '! zzz
x kkk' moet kry, sal die string '! kkk' uitgevoer word.
Die rede is dat ons gereelde uitdrukking soek na
alle karakters vanaf letter 'a' tot letter
'x'. Maar in ons string is daar twee letters
'x'! As gevolg van gierigheid, gebeur dit dat
die gereelde uitdrukking soek tot by die laaste x,
en sodoende vang dit nie wat ons nodig gehad het nie.
Natuurlik is hierdie gedrag dikwels presies wat ons nodig het. Maar in hierdie spesifieke geval moet ons gierigheid uitskakel en vir die gereelde uitdrukking sê dat dit tot by die eerste x moet soek. In hierdie geval moet 'n vraagteken na die herhalingsoperator geplaas word:
res = re.sub('a.+?x', '!', txt)
print(res) # sal die string '! zzz x kkk' uitvoer
Gierigheid kan vir alle herhalingsoperatore beperk word:
beide *, en ?, en
{} - soos volg: *?, ??
en {}?.
Gegee die string:
txt = 'aba accca azzza wwwwa'
Skryf 'n gereelde uitdrukking wat al die
stringe sal vind waar aan beide kante die letters
'a' is, en vervang elkeen met
'!'. Tussen die letters 'a' kan
enige karakter wees (behalwe 'a').