Python-da Regulyar Ifadələrdə Tamağın Məhdudlaşdırılması
Regulyar ifadələr standart olaraq tamaqlıdır. Bu o deməkdir ki, onlar mümkün olan maksimum simvol sayını tutur. Gəlin bir nümunə ilə baxaq. Tutaq ki, bizim belə bir sətirimiz var:
txt = 'aeeex zzz x kkk'
Bu sətirdə biz aşağıdakı şablona görə
'aeeex' alt sətrini tapmaq istəyirik:
'a' hərfi, sonra istənilən simvol
bir və ya daha çox dəfə, sonra isə 'x' hərfi:
res = re.sub('a.+x', '!', txt)
print(res)
Biz '! zzz x kkk' sətirini almaq istəsək də,
'! kkk' sətri çap olunacaq.
Bunun səbəbi odur ki, bizim regulyar ifadə
'a' hərfindən 'x' hərfinə qədər olan
bütün simvolları axtarır. Amma bizim sətirdə iki
'x' hərfi var! Tamağın təsiri ilə belə olur ki,
regulyar ifadə ən son 'x'-ə qədər axtarış edir,
beləliklə, bizim istədiyimizdən fərqli bir nəticə əldə edir.
Əlbəttə ki, çox vaxt bu davranış bizim üçün
lazımdır. Amma xüsusi bu halda tamağı ləğv etmək
və regulyar ifadəyə ilk 'x'-ə qədər axtarmasını
demək lazımdır. Bu halda təkrar operatorundan sonra
sual işarəsi qoymaq lazımdır:
res = re.sub('a.+?x', '!', txt)
print(res) # '! zzz x kkk' sətrini çap edəcək
Tamaq bütün təkrar operatorları üçün məhdudlaşdırıla bilər:
həm *, həm ?, həm də
{} - belə: *?, ??
və {}?.
Sətir verilmişdir:
txt = 'aba accca azzza wwwwa'
Hər iki tərəfində 'a' hərfləri olan bütün
sətirləri tapan və onların hər birini '!' ilə
əvəz edən regulyar ifadə yazın.
'a' hərfləri arasında istənilən simvol ola bilər
('a' istisna olmaqla).