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:
txt = '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:
res = 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:
res = re.sub('a.+?x', '!', txt)
print(res) # '! zzz x kkk' satrini chiqaradi
Ochko‘zlikni barcha takrorlash operatorlariga
cheklash mumkin: *, ?, va
{} - shu tarzda: *?, ??
va {}?.
Quyidagi satr berilgan:
txt = '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.