Python RegExlarida guruhlar ichida defis
Defis - [ ] ichida maxsus belgidir
(tashqarida - emas). Agar sizga defis o'zi kerak bo'lsa - uni
guruh ajratgichi sifatida qabul qilinmaydigan joyga qo‘ying.
Nima uchun bu muhim: siz o'zingiz sezmagan holda
belgilar guruhini yaratib qo'yishingiz mumkin. Masalan,
'[:-@]' - siz ikki nuqta, defis va @ belgisini tanlayotganingizda o'ylaysiz,
aslida esa : va @ orasidagi belgilar guruhi hosil bo'ladi.
Ushbu guruhga quyidagi belgilar kiradi: ? < = > :
Ular qayerdan keladi? ASCII jadvalidan - ikki nuqta raqami @ belgisidan kichik - va guruh hosil bo'ladi. Ya'ni barcha guruhlar ASCII jadvali asosida hosil bo'ladi (agar xohlasangiz bundan foydalanish mumkin).
Bunga qanday yechim topish kerak: defis belgisini
hech qanday tarzda guruh belgisi sifatida qabul qilinmaydigan joyga qo‘ying,
masalan, boshida yoki
oxirida (ya'ni [ dan keyin yoki
] dan oldin).
Shuningdek, defisni ekranlash mumkin - bu holda
u qayerda turishidan qat'iy nazar o'zini anglatadi.
Masalan, [:-@] o'rniga
[:\-@] yozing - va endi guruh
bo'lmaydi, balki uchta belgi bo'ladi - ikki nuqta,
defis va @ belgisi @.
Misol
Quyidagi misolda qidiruv shabloni quyidagicha:
1 raqami, keyin 'a' dan
'z' gacha harf,
keyin 2 raqami:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Kodni bajarish natijasi:
'! 1-2 ! !'
Misol
Keling endi defisni ekranlaymiz.
Natijada qidiruv shabloni quyidagicha:
1 raqami, keyin 'a' harfi, yoki
defis, yoki 'z' harfi, keyin 2 raqami:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Kodni bajarish natijasi:
'! ! 1c2 !'
Misol
Uni ekranlamasdan, shunchaki defisni boshqa joyga o‘tkazish mumkin:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Kodni bajarish natijasi:
'! ! 1c2 !'
Misol
Quyidagi misolda qidiruv shabloni quyidagicha:
birinchi belgi - kichik harflar yoki
defis '-', keyin ikkita 'x' harfi:
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Kodni bajarish natijasi:
'! Axx ! @xx'
Misol
Quyidagi misolda qidiruv shabloni quyidagicha:
birinchi belgi - kichik, katta
harflar yoki defis '-', keyin ikkita 'x' harfi:
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Kodni bajarish natijasi:
'! ! ! @xx'
Misol
Defisni ikkita guruh orasiga qo‘yish mumkin - u yerda u hech qanday yangi guruh yaratmaydi:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Kodni bajarish natijasi:
'! ! ! @xx'
Amaliy vazifalar
Quyidagi satr berilgan:
txt = 'xaz xBz xcz x-z x@z'
Quyidagi shablon bo‘yicha barcha satrlarni toping:
'x' harfi, katta yoki kichik
harf yoki defis, 'z' harfi.
Quyidagi satr berilgan:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Quyidagi shablon bo‘yicha barcha satrlarni toping:
'x' harfi, keyin $, yoki
defis yoki +, keyin 'z' harfi.