Ograničavanje pohlepe u regularnim izrazima u Pythonu
Regularni izrazi su podrazumevano pohlepni. To znači da oni hvataju maksimalan mogući broj karaktera. Hajde da razmotrimo na primeru. Pretpostavimo da imamo ovakav string:
txt = 'aeeex zzz x kkk'
U ovom stringu želimo da pronađemo podstring
'aeeex' prema sledećem šablonu:
slovo 'a', zatim bilo koji karakter
jedan ili više puta, zatim slovo 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Iako očekujemo string '! zzz
x kkk', ispisaće se string '! kkk'.
Ceo problem je u tome što naš regularni izraz traži
sve karaktere od slova 'a' do slova
'x'. Ali u našem stringu ima dva slova
'x'! Zbog pohlepe ispada da
regularni izraz traži do poslednjeg slova x,
time hvatajući nešto što nam nije bilo
potrebno.
Naravno, često nam je takvo ponašanje i potrebno. Ali konkretno u ovom slučaju treba iskљučiti pohlepu i reći regularnom izrazu, da traži do prvog slova x. U ovom slučaju treba posle operatora ponavljanja dodati znak pitanja:
res = re.sub('a.+?x', '!', txt)
print(res) # ispisaće string '! zzz x kkk'
Pohlepu možemo ograničiti svim operatorima
ponavljanja: i *, i ?, i
{} - ovako: *?, ??
i {}?.
Dat je string:
txt = 'aba accca azzza wwwwa'
Napišite regularni izraz koji će pronaći sve
stringove na čijim krajevima stoje slova
'a', i zameniti svaki od njih sa
'!'. Između slova 'a' može
biti bilo koji karakter (osim 'a').