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:

pythontxt = '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:

pythonres = 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:

pythonres = 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ə {}?.

Задание 1

Sətir verilmişdir:

pythontxt = '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).