Python Regular Ifodalarda Maxsus Belgilarni Ekranlash
Faraz qilaylik, maxsus belgi o‘zini o‘zi anglatishi kerak. Buning uchun uni teskari chiziq yordamida ekranlash kerak. Keling, misollar orqali ko‘rib chiqaylik.
Misol
Quyidagi misolda regular ifoda muallifi
qidiruv shabloni harf 'a', keyin
plus '+', keyin harf 'x'
ko‘rinishida bo‘lishini istagan. Biroq, kod
muallifi '+' belgisini ekranlamagan
va shuning uchun qidiruv shabloni aslida
harf 'a' bir yoki bir necha marta,
keyin harf 'x' ko‘rinishida:
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Kodni bajarish natijasi:
'a+x ! ! !'
Misol
Endi esa muallif plusni teskari chiziq bilan
ekranladi. Endi qidiruv shabloni kerakli
ko‘rinishga ega: harf 'a', keyin
plus '+', keyin harf 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Kodni bajarish natijasi:
'! ax aax aaax'
Misol
Ushbu misolda shablon quyidagi ko‘rinishga
ega: harf 'a', keyin nuqta
'.', keyin harf 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Kodni bajarish natijasi:
'! abx azx'
Misol
Quyidagi misolda muallif nuqtani ekranlashni unutgan va regular ifoda barcha pastki qatorlarni qamrab olgan, chunki ekranlanmagan nuqta har qanday belgini anglatadi:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Kodni bajarish natijasi:
'! ! !'
Eslatma
E'tibor bering, agar siz nuqta uchun teskari chiziqni unutsangiz (u o‘zini o‘zi anglatishi kerak bo‘lganida) - buni sezish ham qiyin bo‘lishi mumkin:
res = re.sub('a.x', '!', 'a.x')
print(res) # '!' ni qaytaradi, xuddi biz xohlagandek
Vizual jihatdan to‘g‘ri ishlaydi (chunki
nuqta har qanday belgini, shu jumladan oddiy
nuqta '.' ni ham anglatadi). Lekin
agar almashtirishlar amalga oshiriladigan
qatorni o‘zgartirsak - xatolikni ko‘ramiz:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # '! ! !' ni qaytaradi, kutilyotgan natija '! abx azx' edi
Maxsus va oddiy belgilar ro‘yxati
Agar oddiy belgini ekranlasangiz - hech qanday yomon narsa bo‘lmaydi - u baribir o‘zini anglatadi. Istisno - raqamlar, ularni ekranlab bo‘lmaydi.
Ko‘pincha, ma'lum bir belgi maxsus yoki yo‘qmi degan shubha paydo bo‘ladi. Ba'zilar barcha shubhali belgilarni ketma-ket ekranlashgacha borishadi. Biroq, bu yomon amaliyotdir (regular ifodani teskari chiziqlar bilan to‘ldiradi).
Maxsus belgilar: $ ^ . * + ? \ / {} [] () |
Maxsus belgilar emas: @ : , ' " - _ = < > % # ~ `& !
Amaliy vazifalar
Berilgan qator:
txt = 'a.a aba aea'
'a.a' qatorini topadigan, qolganlarini
qamramaydigan regular ifoda yozing.
Berilgan qator:
txt = '2+3 223 2223'
'2+3' qatorini topadigan, qolganlarini
qamramaydigan regular ifoda yozing.
Berilgan qator:
txt = '23 2+3 2++3 2+++3 345 567'
'2+3', '2++3', '2+++3'
qatorlarini topadigan, qolganlarini
qamramaydigan regular ifoda yozing (+
har qanday miqdorda bo‘lishi mumkin).
Berilgan qator:
txt = '23 2+3 2++3 2+++3 445 677'
'23', '2+3', '2++3',
'2+++3' qatorlarini topadigan,
qolganlarini qamramaydigan regular ifoda
yozing.
Berilgan qator:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
'*q+', '*qq+', '*qqq+'
qatorlarini topadigan, qolganlarini
qamramaydigan regular ifoda yozing.
Berilgan qator:
txt = '[abc] {abc} abc (abc) [abc]'
Qavs ichidagi qatorlarni topadigan va
ularni '!' ga almashtiradigan
regular ifoda yozing.