Pythonda regexlarning ochko‘zligini cheklash

Regexlar standart bo‘yicha ochko‘z. Bu ular maksimal darajada belgilarni qamrab olishini anglatadi. Keling, buni misol bilan ko‘rib chiqaylik. Faraz qilaylik, bizda quyidagi satr bor:

pythontxt = 'aeeex zzz x kkk'

Ushbu satrdan biz quyidagi andozadan foydalanib 'aeeex' qismini topishni xohlaymiz: 'a' harfi, keyin istalgan belgi bir yoki bir necha marta, keyin 'x' harfi:

pythonres = re.sub('a.+x', '!', txt)
print(res)

Biz '! zzz x kkk' satrini olishni xohlasak ham, '! kkk' satri chiqadi. Barcha muammo shundaki, bizning regex 'a' harfidan 'x' harfigacha bo‘lgan barcha belgilarni qidiradi. Ammo bizning satrimizda ikkita 'x' harfi bor! Ochko‘zlik tufayli regex eng oxirgi 'x'gacha qidiradi, shu bilan biz kerakli narsani emas, balki boshqasini qamrab oladi.

Albatta, ko‘p hollarda bu xatti-harakat bizga kerak. Ammo aynan bu holatda ochko‘zlikni bekor qilish va regexga birinchi 'x'gacha qidirishni aytish kerak. Buning uchun takrorlash operatoridan keyin so‘roq belgisini qo‘yish kerak:

pythonres = re.sub('a.+?x', '!', txt)
print(res) # '! zzz x kkk' satrini chiqaradi

Ochko‘zlikni barcha takrorlash operatorlariga cheklash mumkin: *, ?, va {} - shu tarzda: *?, ?? va {}?.

Задание 1

Quyidagi satr berilgan:

pythontxt = 'aba accca azzza wwwwa'

Chettalarida 'a' harflari turgan barcha satrlarni topadigan va ularning har birini '!' bilan almashtiradigan regex yozing. 'a' harflari orasida istalgan belgi ('a' dan boshqa) bo‘lishi mumkin.