Muntazam ifodalar (RegEx) bilan tanishish
Muntazam ifoda (Regular Expression, RegEx) — qidiruv patternini belgilovchi belgilar ketma-ketligi. Masalan,
^a...s$
Yuqoridagi kod RegEx patternini belgilaydi. Pattern: a bilan boshlanib, s bilan tugaydigan istalgan besh harfli satr.
RegEx yordamida aniqlangan patterndan satrga mos kelishini tekshirish uchun foydalanish mumkin.
| Ifoda | Satr | Mos keldimi? |
|---|---|---|
^a...s$ | abs | Mos kelmadi |
alias | Mos keldi | |
abyss | Mos keldi | |
Alias | Mos kelmadi | |
An abacus | Mos kelmadi |
Pythonda RegEx bilan ishlash uchun re nomli modul bor. Mana bir misol:
import re
pattern = '^a...s
Bu yerda, biz `test_string` ichida patternni qidirish uchun `re.match()` funksiyasidan foydalandik. Qidiruv muvaffaqiyatli bo'lsa, metod match obyektini qaytaradi. Aks holda, u `None` qaytaradi.
RegEx bilan ishlash uchun `re` modulida boshqa bir qancha funksiya aniqlangan. Ularni o'rganishdan oldin, keling avval muntazam ifodalarning o'zi haqida bilib olamiz.
Agar siz RegEx asoslarini allaqachon bilsangiz, Python RegEx qismiga o'ting.
## RegEx yordamida patternni belgilash
Muntazam ifodalarni belgilash uchun metabelgilar (metacharacters) ishlatiladi. Yuqoridagi misolda, `^` va `$` — metabelgilar.
## Metabelgilar
Metabelgilar — RegEx dvijogi tomonidan maxsus tarzda talqin qilinadigan belgilar. Mana metabelgilar ro'yxati:
[] . ^ $ * + ? {} () \ |
**[] - Kvadrat qavslar**
Kvadrat qavslar mos kelishini xohlagan belgilar to'plamini belgilaydi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `[abc]` | `a` | 1 ta mos kelish |
| | `ac` | 2 ta mos kelish |
| | `Hey Jude` | Mos kelmadi |
| | `abc de ca` | 5 ta mos kelish |
Bu yerda, `[abc]` agar mos kelishga urinayotgan satringiz `a`, `b` yoki `c`dan istalganini o'z ichiga olsa, mos keladi.
Kvadrat qavslar ichida `-` yordamida belgilar oralig'ini ham belgilashingiz mumkin.
- `[a-e]` `[abcde]` bilan bir xil.
- `[1-4]` `[1234]` bilan bir xil.
- `[0-39]` `[01239]` bilan bir xil.
Kvadrat qavsning boshida karet `^` belgisidan foydalanib belgilar to'plamini to'ldiruvchi (invert) qilishingiz mumkin.
- `[^abc]` `a`, `b` yoki `c`dan boshqa istalgan belgini anglatadi.
- `[^0-9]` raqam bo'lmagan istalgan belgini anglatadi.
**. - Nuqta**
Nuqta istalgan bitta belgiga mos keladi (yangi qator `'\n'`dan tashqari).
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `..` | `a` | Mos kelmadi |
| | `ac` | 1 ta mos kelish |
| | `acd` | 1 ta mos kelish |
| | `acde` | 2 ta mos kelish (4 ta belgidan iborat) |
**^ - Karet**
Karet belgisi `^` satr muayyan belgi bilan boshlanishini tekshirish uchun ishlatiladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `^a` | `a` | 1 ta mos kelish |
| | `abc` | 1 ta mos kelish |
| | `bac` | Mos kelmadi |
| `^ab` | `abc` | 1 ta mos kelish |
| | `acb` | Mos kelmadi (a bilan boshlanadi, lekin undan keyin b kelmaydi) |
**$ - Dollar**
Dollar belgisi `$` satr muayyan belgi bilan tugashini tekshirish uchun ishlatiladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `a$` | `a` | 1 ta mos kelish |
| | `formula` | 1 ta mos kelish |
| | `cab` | Mos kelmadi |
**\* - Yulduzcha**
Yulduzcha belgisi `*` o'zidan chapdagi patternning nol yoki undan ortiq uchrashini tekshiradi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `ma*n` | `mn` | 1 ta mos kelish |
| | `man` | 1 ta mos kelish |
| | `maaan` | 1 ta mos kelish |
| | `main` | Mos kelmadi (a dan keyin n kelmaydi) |
| | `woman` | 1 ta mos kelish |
**+ - Plyus**
Plyus belgisi `+` o'zidan chapdagi patternning bir yoki undan ortiq uchrashini tekshiradi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `ma+n` | `mn` | Mos kelmadi (a belgisi yo'q) |
| | `man` | 1 ta mos kelish |
| | `maaan` | 1 ta mos kelish |
| | `main` | Mos kelmadi (a dan keyin n kelmaydi) |
| | `woman` | 1 ta mos kelish |
**? - So'roq belgisi**
So'roq belgisi `?` o'zidan chapdagi patternning nol yoki bitta uchrashini tekshiradi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `ma?n` | `mn` | 1 ta mos kelish |
| | `man` | 1 ta mos kelish |
| | `maaan` | Mos kelmadi (bir nechta a belgisi bor) |
| | `main` | Mos kelmadi (a dan keyin n kelmaydi) |
| | `woman` | 1 ta mos kelish |
**{} - Figurali qavslar**
Ushbu kodni ko'rib chiqamiz: `{n,m}`. Bu o'zidan chapdagi patternning kamida `n` marta, ko'pi bilan `m` marta takrorlanishini anglatadi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `a{2,3}` | `abc dat` | Mos kelmadi |
| | `abc daat` | 1 ta mos kelish (daat'da) |
| | `aabc daaat` | 2 ta mos kelish (aabc va daaat'da) |
| | `aabc daaaat` | 2 ta mos kelish (aabc va daaaat'da) |
Keling, yana bir misolni sinab ko'ramiz. `[0-9]{2,4}` RegEx'i kamida 2 ta, lekin 4 tadan ortiq bo'lmagan raqamga mos keladi
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `[0-9]{2,4}` | `ab123csde` | 1 ta mos kelish (ab123csde'da) |
| | `12 and 345673` | 3 ta mos kelish (12, 3456, 73) |
| | `1 and 2` | Mos kelmadi |
**\| - Alternatsiya**
Vertikal chiziq `|` alternatsiya (yoki operatori) uchun ishlatiladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `a\|b` | `cde` | Mos kelmadi |
| | `ade` | 1 ta mos kelish (ade'da) |
| | `acdbea` | 3 ta mos kelish (acdbea'da) |
Bu yerda, `a|b` `a` yoki `b`ni o'z ichiga olgan istalgan satrga mos keladi
**() - Guruh**
Qavslar `()` kichik patternlarni (sub-patterns) guruhlash uchun ishlatiladi. Masalan, `(a|b|c)xz` `a`, `b` yoki `c`dan keyin `xz` kelgan istalgan satrga mos keladi
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `(a\|b\|c)xz` | `ab xz` | Mos kelmadi |
| | `abxz` | 1 ta mos kelish (abxz'da) |
| | `axz cabxz` | 2 ta mos kelish (axz va cabxz'da) |
**\ - Teskari qiya chiziq**
Teskari qiya chiziq `\` barcha metabelgilar jumladan turli belgilarni escape qilish uchun ishlatiladi. Masalan,
`\$a` agar satr `$` dan keyin `a` kelgan bo'lsa mos keladi. Bu yerda, `$` RegEx dvijogi tomonidan maxsus tarzda talqin qilinmaydi.
Agar belgi maxsus ma'noga ega yoki yo'qligiga aminan bo'lmasangiz, uning oldiga `\` qo'yishingiz mumkin. Bu belgi maxsus tarzda ko'rib chiqilmasligini ta'minlaydi.
## Maxsus ketma-ketliklar
Maxsus ketma-ketliklar keng ishlatiladigan patternlarni yozishni osonlashtiradi. Mana maxsus ketma-ketliklar ro'yxati:
`\A` - Agar belgilangan belgilar satrning boshida bo'lsa mos keladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\Athe` | `the sun` | Mos keldi |
| | `In the sun` | Mos kelmadi |
`\b` - Agar belgilangan belgilar so'zning boshida yoki oxirida bo'lsa mos keladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\bfoo` | `football` | Mos keldi |
| | `a football` | Mos keldi |
| | `afootball` | Mos kelmadi |
| `foo\b` | `the foo` | Mos keldi |
| | `the afoo test` | Mos keldi |
| | `the afootest` | Mos kelmadi |
`\B` - `\b`ning teskarisi. Agar belgilangan belgilar so'zning boshida yoki oxirida bo'lmasa mos keladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\Bfoo` | `football` | Mos kelmadi |
| | `a football` | Mos kelmadi |
| | `afootball` | Mos keldi |
| `foo\B` | `the foo` | Mos kelmadi |
| | `the afoo test` | Mos kelmadi |
| | `the afootest` | Mos keldi |
`\d` - Istalgan o'nlik raqamga mos keladi. `[0-9]`ga teng
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\d` | `12abc3` | 3 ta mos kelish (12abc3'da) |
| | `Python` | Mos kelmadi |
`\D` - O'nlik bo'lmagan istalgan raqamga mos keladi. `[^0-9]`ga teng
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\D` | `1ab34"50` | 3 ta mos kelish (1ab34"50'da) |
| | `1345` | Mos kelmadi |
`\s` - Satrda istalgan bo'sh joy belgisi bo'lgan joyga mos keladi. `[ \t\n\r\f\v]`ga teng.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\s` | `Python RegEx` | 1 ta mos kelish |
| | `PythonRegEx` | Mos kelmadi |
`\S` - Satrda istalgan bo'sh joy bo'lmagan belgi bo'lgan joyga mos keladi. `[^ \t\n\r\f\v]`ga teng.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\S` | `a b` | 2 ta mos kelish (a b'da) |
| | ` ` (bo'sh joy) | Mos kelmadi |
`\w` - Istalgan alfanumerik belgiga (raqam va harflar) mos keladi. `[a-zA-Z0-9_]`ga teng. Aytgancha, pastki chiziq `_` ham alfanumerik belgi hisoblanadi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\w` | `12&": ;c ` | 3 ta mos kelish |
| | `%"> !` | Mos kelmadi |
`\W` - Alfanumerik bo'lmagan istalgan belgiga mos keladi. `[^a-zA-Z0-9_]`ga teng
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\W` | `1a2%c` | 1 ta mos kelish |
| | `Python` | Mos kelmadi |
`\Z` - Agar belgilangan belgilar satrning oxirida bo'lsa mos keladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `Python\Z` | `I like Python` | 1 ta mos kelish |
| | `I like Python Programming` | Mos kelmadi |
| | `Python is fun.` | Mos kelmadi |
Maslahat: Muntazam ifodalarni yaratish va sinash uchun regex101 kabi RegEx tester vositalaridan foydalanishingiz mumkin. Bu vosita nafaqat muntazam ifodalar yaratishda yordam beradi, balki uni o'rganishga ham yordam beradi.
Endi siz RegEx asoslarini tushunasiz, keling Python kodingizda RegEx'dan qanday foydalanishni muhokama qilamiz.
## Python RegEx
Pythonda muntazam ifodalar bilan ishlash uchun `re` nomli modul bor. Undan foydalanish uchun, modulni import qilishimiz kerak.
```python
import re
Modul RegEx bilan ishlash uchun bir nechta funksiya va konstantalarni aniqlaydi.
re.findall()
re.findall() metodi barcha mos kelishlarni o'z ichiga olgan satrlar ro'yxatini qaytaradi.
1-misol: re.findall()
# Satrdan sonlarni ajratib olish dasturi
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result)
# Natija: ['12', '89', '34']
Agar pattern topilmasa, re.findall() bo'sh ro'yxat qaytaradi.
re.split()
re.split metodi satrni mos kelish bo'lgan joydan bo'ladi va bo'linishlar sodir bo'lgan satrlar ro'yxatini qaytaradi.
2-misol: re.split()
import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)
# Natija: ['Twelve:', ' Eighty nine:', '.']
Agar pattern topilmasa, re.split() asl satrni o'z ichiga olgan ro'yxatni qaytaradi.
re.split() metodiga maxsplit argumentini uzatishingiz mumkin. Bu sodir bo'ladigan bo'linishlarning maksimal soni.
import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# maxsplit = 1
# faqat birinchi uchrashda bo'lish
result = re.split(pattern, string, 1)
print(result)
# Natija: ['Twelve:', ' Eighty nine:89 Nine:9.']
Aytgancha, maxsplitning standart qiymati 0; ya'ni barcha mumkin bo'lgan bo'linishlar.
re.sub()
re.sub()ning sintaksisi:
re.sub(pattern, replace, string)
Metod mos kelgan uchrashlar replace o'zgaruvchisining kontenti bilan almashtirilgan satrni qaytaradi.
3-misol: re.sub()
# Barcha bo'sh joylarni o'chirish dasturi
import re
# ko'p qatorli satr
string = 'abc 12\
de 23 \n f45 6'
# barcha bo'sh joy belgilariga mos keladi
pattern = '\s+'
# bo'sh satr
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)
# Natija: abc12de23f456
Agar pattern topilmasa, re.sub() asl satrni qaytaradi.
Siz re.sub() metodiga to'rtinchi parametr sifatida countni uzatishingiz mumkin. Agar tashlab ketilsa, u 0ga teng bo'ladi. Bu barcha uchrashlarni almashtiradi.
import re
# ko'p qatorli satr
string = 'abc 12\
de 23 \n f45 6'
# barcha bo'sh joy belgilariga mos keladi
pattern = '\s+'
replace = ''
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)
# Natija:
# abc12de 23
# f45 6
re.subn()
re.subn() re.sub()ga o'xshaydi, faqat u yangi satr va amalga oshirilgan almashtirishlar sonini o'z ichiga olgan 2 elementli kortejni qaytaradi.
4-misol: re.subn()
# Barcha bo'sh joylarni o'chirish dasturi
import re
# ko'p qatorli satr
string = 'abc 12\
de 23 \n f45 6'
# barcha bo'sh joy belgilariga mos keladi
pattern = '\s+'
# bo'sh satr
replace = ''
new_string = re.subn(pattern, replace, string)
print(new_string)
# Natija: ('abc12de23f456', 4)
re.search()
re.search() metodi ikkita argumentni oladi: pattern va satr. Metod RegEx patterni satr bilan mos kelish hosil qiladigan birinchi joyni qidiradi.
Agar qidiruv muvaffaqiyatli bo'lsa, re.search() match obyektini qaytaradi; aks holda, u None qaytaradi.
match = re.search(pattern, str)
5-misol: re.search()
import re
string = "Python is fun"
# 'Python' boshida ekanligini tekshirish
match = re.search('\APython', string)
if match:
print("pattern found inside the string")
else:
print("pattern not found")
# Natija: pattern found inside the string
Bu yerda, match match obyektini o'z ichiga oladi.
dir() funksiyasi yordamida match obyektining metod va atributlarini olishingiz mumkin.
Match obyektlarining ko'p ishlatiladigan ba'zi metod va atributlari:
match.group()
group() metodi mos kelish mavjud bo'lgan satr qismini qaytaradi.
6-misol: Match obyekti
import re
string = '39801 356, 2102 1111'
# Bo'sh joydan keyin ikki xonali son kelgan uch xonali son
pattern = '(\d{3}) (\d{2})'
# match o'zgaruvchisi Match obyektini o'z ichiga oladi.
match = re.search(pattern, string)
if match:
print(match.group())
else:
print("pattern not found")
# Natija: 801 35
Bu yerda, match o'zgaruvchisi match obyektini o'z ichiga oladi.
Bizning (\d{3}) (\d{2}) patternimiz ikkita kichik guruhga (subgroup) ega: (\d{3}) va (\d{2}). Siz bu qavs ichiga olingan kichik guruhlarning satr qismini olishingiz mumkin. Mana buni qanday qilish mumkin:
>>> match.group(1)
'801'
>>> match.group(2)
'35'
>>> match.group(1, 2)
('801', '35')
>>> match.groups()
('801', '35')
match.start(), match.end() va match.span()
start() funksiyasi mos kelgan kichik satrning boshlanish indeksini qaytaradi. Xuddi shunday, end() mos kelgan kichik satrning tugash indeksini qaytaradi.
>>> match.start()
2
>>> match.end()
8
span() funksiyasi mos kelgan qismning boshlanish va tugash indeksini o'z ichiga olgan kortejni qaytaradi.
>>> match.span()
(2, 8)
match.re va match.string
Match obyektining re atributi muntazam ifoda obyektini qaytaradi. Xuddi shunday, string atributi uzatilgan satrni qaytaradi.
>>> match.re
re.compile('(\\d{3}) (\\d{2})')
>>> match.string
'39801 356, 2102 1111'
Biz re modulida aniqlangan barcha ko'p ishlatiladigan metodlarni ko'rib chiqdik. Agar ko'proq bilmoqchi bo'lsangiz, Python 3 re module sahifasiga tashrif buyuring.
Muntazam ifodadan oldin r yoki R prefiksi ishlatilganda, bu xom (raw) satrni anglatadi. Masalan, '\n' yangi qator, r'\n' esa ikkita belgini anglatadi: teskari qiya chiziq \ dan keyin n.
Teskari qiya chiziq \ barcha metabelgilar jumladan turli belgilarni escape qilish uchun ishlatiladi. Biroq, r prefiksidan foydalanish \ni oddiy belgi sifatida ko'rib chiqishga majbur qiladi.
7-misol: r prefiksi yordamida xom satr
import re
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result)
# Natija: ['\n', '\r']
test_string = 'abyss' result = re.match(pattern, test_string)
if result: print("Search successful.") else: print("Search unsuccessful.")
Bu yerda, biz `test_string` ichida patternni qidirish uchun `re.match()` funksiyasidan foydalandik. Qidiruv muvaffaqiyatli bo'lsa, metod match obyektini qaytaradi. Aks holda, u `None` qaytaradi.
RegEx bilan ishlash uchun `re` modulida boshqa bir qancha funksiya aniqlangan. Ularni o'rganishdan oldin, keling avval muntazam ifodalarning o'zi haqida bilib olamiz.
Agar siz RegEx asoslarini allaqachon bilsangiz, Python RegEx qismiga o'ting.
## RegEx yordamida patternni belgilash
Muntazam ifodalarni belgilash uchun metabelgilar (metacharacters) ishlatiladi. Yuqoridagi misolda, `^` va `$` — metabelgilar.
## Metabelgilar
Metabelgilar — RegEx dvijogi tomonidan maxsus tarzda talqin qilinadigan belgilar. Mana metabelgilar ro'yxati:
[] . ^ $ * + ? {} () \ |
**[] - Kvadrat qavslar**
Kvadrat qavslar mos kelishini xohlagan belgilar to'plamini belgilaydi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `[abc]` | `a` | 1 ta mos kelish |
| | `ac` | 2 ta mos kelish |
| | `Hey Jude` | Mos kelmadi |
| | `abc de ca` | 5 ta mos kelish |
Bu yerda, `[abc]` agar mos kelishga urinayotgan satringiz `a`, `b` yoki `c`dan istalganini o'z ichiga olsa, mos keladi.
Kvadrat qavslar ichida `-` yordamida belgilar oralig'ini ham belgilashingiz mumkin.
- `[a-e]` `[abcde]` bilan bir xil.
- `[1-4]` `[1234]` bilan bir xil.
- `[0-39]` `[01239]` bilan bir xil.
Kvadrat qavsning boshida karet `^` belgisidan foydalanib belgilar to'plamini to'ldiruvchi (invert) qilishingiz mumkin.
- `[^abc]` `a`, `b` yoki `c`dan boshqa istalgan belgini anglatadi.
- `[^0-9]` raqam bo'lmagan istalgan belgini anglatadi.
**. - Nuqta**
Nuqta istalgan bitta belgiga mos keladi (yangi qator `'\n'`dan tashqari).
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `..` | `a` | Mos kelmadi |
| | `ac` | 1 ta mos kelish |
| | `acd` | 1 ta mos kelish |
| | `acde` | 2 ta mos kelish (4 ta belgidan iborat) |
**^ - Karet**
Karet belgisi `^` satr muayyan belgi bilan boshlanishini tekshirish uchun ishlatiladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `^a` | `a` | 1 ta mos kelish |
| | `abc` | 1 ta mos kelish |
| | `bac` | Mos kelmadi |
| `^ab` | `abc` | 1 ta mos kelish |
| | `acb` | Mos kelmadi (a bilan boshlanadi, lekin undan keyin b kelmaydi) |
**$ - Dollar**
Dollar belgisi `$` satr muayyan belgi bilan tugashini tekshirish uchun ishlatiladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `a$` | `a` | 1 ta mos kelish |
| | `formula` | 1 ta mos kelish |
| | `cab` | Mos kelmadi |
**\* - Yulduzcha**
Yulduzcha belgisi `*` o'zidan chapdagi patternning nol yoki undan ortiq uchrashini tekshiradi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `ma*n` | `mn` | 1 ta mos kelish |
| | `man` | 1 ta mos kelish |
| | `maaan` | 1 ta mos kelish |
| | `main` | Mos kelmadi (a dan keyin n kelmaydi) |
| | `woman` | 1 ta mos kelish |
**+ - Plyus**
Plyus belgisi `+` o'zidan chapdagi patternning bir yoki undan ortiq uchrashini tekshiradi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `ma+n` | `mn` | Mos kelmadi (a belgisi yo'q) |
| | `man` | 1 ta mos kelish |
| | `maaan` | 1 ta mos kelish |
| | `main` | Mos kelmadi (a dan keyin n kelmaydi) |
| | `woman` | 1 ta mos kelish |
**? - So'roq belgisi**
So'roq belgisi `?` o'zidan chapdagi patternning nol yoki bitta uchrashini tekshiradi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `ma?n` | `mn` | 1 ta mos kelish |
| | `man` | 1 ta mos kelish |
| | `maaan` | Mos kelmadi (bir nechta a belgisi bor) |
| | `main` | Mos kelmadi (a dan keyin n kelmaydi) |
| | `woman` | 1 ta mos kelish |
**{} - Figurali qavslar**
Ushbu kodni ko'rib chiqamiz: `{n,m}`. Bu o'zidan chapdagi patternning kamida `n` marta, ko'pi bilan `m` marta takrorlanishini anglatadi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `a{2,3}` | `abc dat` | Mos kelmadi |
| | `abc daat` | 1 ta mos kelish (daat'da) |
| | `aabc daaat` | 2 ta mos kelish (aabc va daaat'da) |
| | `aabc daaaat` | 2 ta mos kelish (aabc va daaaat'da) |
Keling, yana bir misolni sinab ko'ramiz. `[0-9]{2,4}` RegEx'i kamida 2 ta, lekin 4 tadan ortiq bo'lmagan raqamga mos keladi
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `[0-9]{2,4}` | `ab123csde` | 1 ta mos kelish (ab123csde'da) |
| | `12 and 345673` | 3 ta mos kelish (12, 3456, 73) |
| | `1 and 2` | Mos kelmadi |
**\| - Alternatsiya**
Vertikal chiziq `|` alternatsiya (yoki operatori) uchun ishlatiladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `a\|b` | `cde` | Mos kelmadi |
| | `ade` | 1 ta mos kelish (ade'da) |
| | `acdbea` | 3 ta mos kelish (acdbea'da) |
Bu yerda, `a|b` `a` yoki `b`ni o'z ichiga olgan istalgan satrga mos keladi
**() - Guruh**
Qavslar `()` kichik patternlarni (sub-patterns) guruhlash uchun ishlatiladi. Masalan, `(a|b|c)xz` `a`, `b` yoki `c`dan keyin `xz` kelgan istalgan satrga mos keladi
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `(a\|b\|c)xz` | `ab xz` | Mos kelmadi |
| | `abxz` | 1 ta mos kelish (abxz'da) |
| | `axz cabxz` | 2 ta mos kelish (axz va cabxz'da) |
**\ - Teskari qiya chiziq**
Teskari qiya chiziq `\` barcha metabelgilar jumladan turli belgilarni escape qilish uchun ishlatiladi. Masalan,
`\$a` agar satr `$` dan keyin `a` kelgan bo'lsa mos keladi. Bu yerda, `$` RegEx dvijogi tomonidan maxsus tarzda talqin qilinmaydi.
Agar belgi maxsus ma'noga ega yoki yo'qligiga aminan bo'lmasangiz, uning oldiga `\` qo'yishingiz mumkin. Bu belgi maxsus tarzda ko'rib chiqilmasligini ta'minlaydi.
## Maxsus ketma-ketliklar
Maxsus ketma-ketliklar keng ishlatiladigan patternlarni yozishni osonlashtiradi. Mana maxsus ketma-ketliklar ro'yxati:
`\A` - Agar belgilangan belgilar satrning boshida bo'lsa mos keladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\Athe` | `the sun` | Mos keldi |
| | `In the sun` | Mos kelmadi |
`\b` - Agar belgilangan belgilar so'zning boshida yoki oxirida bo'lsa mos keladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\bfoo` | `football` | Mos keldi |
| | `a football` | Mos keldi |
| | `afootball` | Mos kelmadi |
| `foo\b` | `the foo` | Mos keldi |
| | `the afoo test` | Mos keldi |
| | `the afootest` | Mos kelmadi |
`\B` - `\b`ning teskarisi. Agar belgilangan belgilar so'zning boshida yoki oxirida bo'lmasa mos keladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\Bfoo` | `football` | Mos kelmadi |
| | `a football` | Mos kelmadi |
| | `afootball` | Mos keldi |
| `foo\B` | `the foo` | Mos kelmadi |
| | `the afoo test` | Mos kelmadi |
| | `the afootest` | Mos keldi |
`\d` - Istalgan o'nlik raqamga mos keladi. `[0-9]`ga teng
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\d` | `12abc3` | 3 ta mos kelish (12abc3'da) |
| | `Python` | Mos kelmadi |
`\D` - O'nlik bo'lmagan istalgan raqamga mos keladi. `[^0-9]`ga teng
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\D` | `1ab34"50` | 3 ta mos kelish (1ab34"50'da) |
| | `1345` | Mos kelmadi |
`\s` - Satrda istalgan bo'sh joy belgisi bo'lgan joyga mos keladi. `[ \t\n\r\f\v]`ga teng.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\s` | `Python RegEx` | 1 ta mos kelish |
| | `PythonRegEx` | Mos kelmadi |
`\S` - Satrda istalgan bo'sh joy bo'lmagan belgi bo'lgan joyga mos keladi. `[^ \t\n\r\f\v]`ga teng.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\S` | `a b` | 2 ta mos kelish (a b'da) |
| | ` ` (bo'sh joy) | Mos kelmadi |
`\w` - Istalgan alfanumerik belgiga (raqam va harflar) mos keladi. `[a-zA-Z0-9_]`ga teng. Aytgancha, pastki chiziq `_` ham alfanumerik belgi hisoblanadi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\w` | `12&": ;c ` | 3 ta mos kelish |
| | `%"> !` | Mos kelmadi |
`\W` - Alfanumerik bo'lmagan istalgan belgiga mos keladi. `[^a-zA-Z0-9_]`ga teng
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `\W` | `1a2%c` | 1 ta mos kelish |
| | `Python` | Mos kelmadi |
`\Z` - Agar belgilangan belgilar satrning oxirida bo'lsa mos keladi.
| Ifoda | Satr | Mos keldimi? |
| --- | --- | --- |
| `Python\Z` | `I like Python` | 1 ta mos kelish |
| | `I like Python Programming` | Mos kelmadi |
| | `Python is fun.` | Mos kelmadi |
Maslahat: Muntazam ifodalarni yaratish va sinash uchun regex101 kabi RegEx tester vositalaridan foydalanishingiz mumkin. Bu vosita nafaqat muntazam ifodalar yaratishda yordam beradi, balki uni o'rganishga ham yordam beradi.
Endi siz RegEx asoslarini tushunasiz, keling Python kodingizda RegEx'dan qanday foydalanishni muhokama qilamiz.
## Python RegEx
Pythonda muntazam ifodalar bilan ishlash uchun `re` nomli modul bor. Undan foydalanish uchun, modulni import qilishimiz kerak.
```python
import re
Modul RegEx bilan ishlash uchun bir nechta funksiya va konstantalarni aniqlaydi.
re.findall()
re.findall() metodi barcha mos kelishlarni o'z ichiga olgan satrlar ro'yxatini qaytaradi.
1-misol: re.findall()
# Satrdan sonlarni ajratib olish dasturi
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result)
# Natija: ['12', '89', '34']
Agar pattern topilmasa, re.findall() bo'sh ro'yxat qaytaradi.
re.split()
re.split metodi satrni mos kelish bo'lgan joydan bo'ladi va bo'linishlar sodir bo'lgan satrlar ro'yxatini qaytaradi.
2-misol: re.split()
import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result)
# Natija: ['Twelve:', ' Eighty nine:', '.']
Agar pattern topilmasa, re.split() asl satrni o'z ichiga olgan ro'yxatni qaytaradi.
re.split() metodiga maxsplit argumentini uzatishingiz mumkin. Bu sodir bo'ladigan bo'linishlarning maksimal soni.
import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# maxsplit = 1
# faqat birinchi uchrashda bo'lish
result = re.split(pattern, string, 1)
print(result)
# Natija: ['Twelve:', ' Eighty nine:89 Nine:9.']
Aytgancha, maxsplitning standart qiymati 0; ya'ni barcha mumkin bo'lgan bo'linishlar.
re.sub()
re.sub()ning sintaksisi:
re.sub(pattern, replace, string)
Metod mos kelgan uchrashlar replace o'zgaruvchisining kontenti bilan almashtirilgan satrni qaytaradi.
3-misol: re.sub()
# Barcha bo'sh joylarni o'chirish dasturi
import re
# ko'p qatorli satr
string = 'abc 12\
de 23 \n f45 6'
# barcha bo'sh joy belgilariga mos keladi
pattern = '\s+'
# bo'sh satr
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string)
# Natija: abc12de23f456
Agar pattern topilmasa, re.sub() asl satrni qaytaradi.
Siz re.sub() metodiga to'rtinchi parametr sifatida countni uzatishingiz mumkin. Agar tashlab ketilsa, u 0ga teng bo'ladi. Bu barcha uchrashlarni almashtiradi.
import re
# ko'p qatorli satr
string = 'abc 12\
de 23 \n f45 6'
# barcha bo'sh joy belgilariga mos keladi
pattern = '\s+'
replace = ''
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string)
# Natija:
# abc12de 23
# f45 6
re.subn()
re.subn() re.sub()ga o'xshaydi, faqat u yangi satr va amalga oshirilgan almashtirishlar sonini o'z ichiga olgan 2 elementli kortejni qaytaradi.
4-misol: re.subn()
# Barcha bo'sh joylarni o'chirish dasturi
import re
# ko'p qatorli satr
string = 'abc 12\
de 23 \n f45 6'
# barcha bo'sh joy belgilariga mos keladi
pattern = '\s+'
# bo'sh satr
replace = ''
new_string = re.subn(pattern, replace, string)
print(new_string)
# Natija: ('abc12de23f456', 4)
re.search()
re.search() metodi ikkita argumentni oladi: pattern va satr. Metod RegEx patterni satr bilan mos kelish hosil qiladigan birinchi joyni qidiradi.
Agar qidiruv muvaffaqiyatli bo'lsa, re.search() match obyektini qaytaradi; aks holda, u None qaytaradi.
match = re.search(pattern, str)
5-misol: re.search()
import re
string = "Python is fun"
# 'Python' boshida ekanligini tekshirish
match = re.search('\APython', string)
if match:
print("pattern found inside the string")
else:
print("pattern not found")
# Natija: pattern found inside the string
Bu yerda, match match obyektini o'z ichiga oladi.
dir() funksiyasi yordamida match obyektining metod va atributlarini olishingiz mumkin.
Match obyektlarining ko'p ishlatiladigan ba'zi metod va atributlari:
match.group()
group() metodi mos kelish mavjud bo'lgan satr qismini qaytaradi.
6-misol: Match obyekti
import re
string = '39801 356, 2102 1111'
# Bo'sh joydan keyin ikki xonali son kelgan uch xonali son
pattern = '(\d{3}) (\d{2})'
# match o'zgaruvchisi Match obyektini o'z ichiga oladi.
match = re.search(pattern, string)
if match:
print(match.group())
else:
print("pattern not found")
# Natija: 801 35
Bu yerda, match o'zgaruvchisi match obyektini o'z ichiga oladi.
Bizning (\d{3}) (\d{2}) patternimiz ikkita kichik guruhga (subgroup) ega: (\d{3}) va (\d{2}). Siz bu qavs ichiga olingan kichik guruhlarning satr qismini olishingiz mumkin. Mana buni qanday qilish mumkin:
>>> match.group(1)
'801'
>>> match.group(2)
'35'
>>> match.group(1, 2)
('801', '35')
>>> match.groups()
('801', '35')
match.start(), match.end() va match.span()
start() funksiyasi mos kelgan kichik satrning boshlanish indeksini qaytaradi. Xuddi shunday, end() mos kelgan kichik satrning tugash indeksini qaytaradi.
>>> match.start()
2
>>> match.end()
8
span() funksiyasi mos kelgan qismning boshlanish va tugash indeksini o'z ichiga olgan kortejni qaytaradi.
>>> match.span()
(2, 8)
match.re va match.string
Match obyektining re atributi muntazam ifoda obyektini qaytaradi. Xuddi shunday, string atributi uzatilgan satrni qaytaradi.
>>> match.re
re.compile('(\\d{3}) (\\d{2})')
>>> match.string
'39801 356, 2102 1111'
Biz re modulida aniqlangan barcha ko'p ishlatiladigan metodlarni ko'rib chiqdik. Agar ko'proq bilmoqchi bo'lsangiz, Python 3 re module sahifasiga tashrif buyuring.
Muntazam ifodadan oldin r yoki R prefiksi ishlatilganda, bu xom (raw) satrni anglatadi. Masalan, '\n' yangi qator, r'\n' esa ikkita belgini anglatadi: teskari qiya chiziq \ dan keyin n.
Teskari qiya chiziq \ barcha metabelgilar jumladan turli belgilarni escape qilish uchun ishlatiladi. Biroq, r prefiksidan foydalanish \ni oddiy belgi sifatida ko'rib chiqishga majbur qiladi.
7-misol: r prefiksi yordamida xom satr
import re
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result)
# Natija: ['\n', '\r']