Kufizimi i lakmisë në shprehjet e rregullta në Python
Shprehjet e rregullta si parazgjedhje janë lakmore. Kjo do të thotë se ato kapin numrin maksimal të mundshëm të karaktereve. Le ta shqyrtojmë me një shembull. Le të themi se kemi këtë varg:
txt = 'aeeex zzz x kkk'
Në këtë varg, duam të gjejmë nënvargun
'aeeex' sipas modelit të mëposhtëm:
shkronja 'a', pastaj çdo karakter
një ose më shumë herë, pastaj shkronja 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Edhe pse duhet të marrim vargun '! zzz
x kkk', do të printohet vargu '! kkk'.
E gjithë çështja është se shprehja jonë e rregullt kërkon
të gjitha karakteret nga shkronja 'a' deri te shkronja
'x'. Por në vargun tonë janë dy shkronja
'x'! Për shkak të lakmisë del se
shprehja e rregullt kërkon deri te 'x' i fundit,
duke kapur kështu diçka tjetër nga ajo që na duhej.
Sigurisht, shpesh kjo sjellje është ajo që na nevojitet. Por konkretisht në këtë rast duhet të anulohet lakmia dhe t'i thuhet shprehjes së rregullt, që të kërkojë deri te 'x' i parë. Në këtë rast, duhet të vendosni shenjën pyetje pas operatorit të përsëritjes:
res = re.sub('a.+?x', '!', txt)
print(res) # do të printojë vargun '! zzz x kkk'
Lakmia mund të kufizohet për të gjithë operatorët
e përsëritjes: si *, ashtu edhe ?, dhe
{} - kështu: *?, ??
dhe {}?.
Është dhënë vargu:
txt = 'aba accca azzza wwwwa'
Shkruani një shprehje të rregullt, e cila do të gjejë të gjitha
vargjet në skajet e të cilave ndodhen shkronjat
'a', dhe do të zëvendësojë secilën prej tyre me
'!'. Midis shkronjave 'a' mund
të ketë çdo karakter (përveç 'a').