Begrensning av grådighet i regulære uttrykk i Python
Regulære uttrykk er som standard grådige. Dette betyr at de fanger opp maksimalt mulig antall tegn. La oss se på et eksempel. La oss si at vi har følgende streng:
txt = 'aeeex zzz x kkk'
I denne strengen ønsker vi å finne delstrengen
'aeeex' ved å bruke følgende mønster:
bokstaven 'a', deretter hvilket som helst tegn
en eller flere ganger, deretter bokstaven 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Selv om vi ønsker å få strengen '! zzz
x kkk', vil strengen '! kkk' bli skrevet ut.
Årsaken er at vårt regulære uttrykk søker etter
alle tegn fra bokstaven 'a' til bokstaven
'x'. Men i strengen vår er det to bokstaver
'x'! På grunn av grådigheten ender det med at
det regulære uttrykket søker til den siste 'x'en,
og fanger dermed opp noe annet enn det vi
trengte.
Selvfølgelig er dette oppførselen vi ønsker oss i mange tilfeller. Men akkurat i dette tilfellet må vi deaktivere grådigheten og fortelle det regulære uttrykket at det skal søke til den første 'x'en. I dette tilfellet bør vi sette et spørsmålstegn etter repetisjonsoperatoren:
res = re.sub('a.+?x', '!', txt)
print(res) # vil skrive ut strengen '! zzz x kkk'
Grådighet kan begrenses for alle repetisjonsoperatorer:
både *, ?, og
{} - slik: *?, ??
og {}?.
Gitt følgende streng:
txt = 'aba accca azzza wwwwa'
Skriv et regulært uttrykk som finner alle
strenger som har bokstaven
'a' i begge ender, og erstatter hver av dem med
'!'. Mellom bokstavene 'a' kan det
være hvilket som helst tegn (bortsett fra 'a').