14. Regular Expression — muntazam ifodalar¶
Regular Expression, qisqacha Regex, matn ichidan ma'lum naqshlarni qidirish, tekshirish, ajratib olish va almashtirish uchun ishlatiladi.
Python'da Regex bilan ishlash uchun re moduli mavjud.
Regex yordamida:
email manzillarni topish
telefon raqamlarini topish
URL manzillarni topish
raqamlarni ajratib olish
ma'lum so'zlarni qidirish
matn formatini tekshirish
matn qismlarini almashtirish
guruhlar bilan ishlash
mumkin.
re moduli¶
Regex bilan ishlash uchun avval re modulini import qilamiz:
import re
Masalan:
import re
matn = "Softromeda Python dasturlashni o'rganmoqda."
natija = re.search(
"Python",
matn
)
if natija:
print(
"Python so'zi topildi."
)
Natija:
Python so'zi topildi.
Regex naqshi¶
Regex'da oddiy matnning o'zi ham naqsh bo'lishi mumkin.
import re
matn = "Softromeda Python dasturlashni o'rganmoqda."
if re.search(
"Python",
matn
):
print(
"Kerakli so'z topildi."
)
Bu yerda:
"Python"
Regex naqshi hisoblanadi.
search()¶
search() matnning istalgan joyidan naqshni qidiradi.
import re
matn = "Bugun Python bilan ishlaymiz."
natija = re.search(
"Python",
matn
)
if natija:
print(
"So'z topildi."
)
else:
print(
"So'z topilmadi."
)
Natija:
So'z topildi.
search() natijasi¶
Agar naqsh topilsa, search() maxsus Match obyektini qaytaradi.
import re
matn = "Softromeda Python dasturlashni o'rganmoqda."
natija = re.search(
"Python",
matn
)
if natija:
print(
f"Topilgan matn: {natija.group()}"
)
print(
f"Boshlanish joyi: {natija.start()}"
)
print(
f"Tugash joyi: {natija.end()}"
)
match()¶
match() faqat matnning boshidan naqshni tekshiradi.
import re
matn = "Python dasturlash tili."
natija = re.match(
"Python",
matn
)
if natija:
print(
"Matn Python bilan boshlangan."
)
Natija:
Matn Python bilan boshlangan.
Agar:
matn = "Men Python o'rganyapman."
bo'lsa:
natija = re.match(
"Python",
matn
)
hech narsa topmaydi, chunki Python matn boshida emas.
match() va search() farqi¶
match():
faqat boshidan qidiradi
search():
matnning istalgan joyidan qidiradi
Masalan:
import re
matn = "Men Python o'rganyapman."
birinchi_natija = re.match(
"Python",
matn
)
ikkinchi_natija = re.search(
"Python",
matn
)
print(
f"match natijasi: {birinchi_natija}"
)
print(
f"search natijasi: {ikkinchi_natija}"
)
Bu yerda match() natija topmaydi, search() esa topadi.
findall()¶
findall() naqshga mos keladigan barcha qiymatlarni ro'yxat ko'rinishida qaytaradi.
import re
matn = """
Softromeda Python bilan ishlaydi.
Python juda qulay.
Python kuchli dasturlash tilidir.
"""
natijalar = re.findall(
"Python",
matn
)
print(
f"Topilganlar: {natijalar}"
)
print(
f"Soni: {len(natijalar)}"
)
Natija:
Topilganlar: ['Python', 'Python', 'Python']
Soni: 3
findall() bilan raqamlarni topish¶
Regex'dagi:
\d
bitta raqamni bildiradi.
import re
matn = "Softromeda 2026-yilda 15 ta loyiha yaratdi."
raqamlar = re.findall(
r"\d",
matn
)
print(
f"Raqamlar: {raqamlar}"
)
Natija:
Raqamlar: ['2', '0', '2', '6', '1', '5']
\d¶
\d raqamni bildiradi:
0
1
2
3
4
5
6
7
8
9
Masalan:
import re
matn = "Softromeda 12345."
raqamlar = re.findall(
r"\d",
matn
)
print(
raqamlar
)
\D¶
\D raqam bo'lmagan belgilarni bildiradi.
import re
matn = "123abc"
natijalar = re.findall(
r"\D",
matn
)
print(
natijalar
)
Natija:
['a', 'b', 'c']
\w¶
\w odatda harf, raqam va _ kabi so'z belgilarini anglatadi.
import re
matn = "Softromeda_2026"
natijalar = re.findall(
r"\w",
matn
)
print(
natijalar
)
\W¶
\W so'z belgisi bo'lmagan belgilarni topadi.
import re
matn = "Softromeda 2026!"
natijalar = re.findall(
r"\W",
matn
)
print(
natijalar
)
Bu bo'sh joy va ! kabi belgilarni topishi mumkin.
\s¶
\s bo'sh joy belgilarini bildiradi.
Bunga:
bo'sh joy
tab
yangi qator
kabi belgilar kiradi.
import re
matn = "Softromeda Python"
natijalar = re.findall(
r"\s",
matn
)
print(
f"Bo'sh joylar soni: {len(natijalar)}"
)
. belgisi¶
Regex'dagi . deyarli istalgan bitta belgini bildiradi.
import re
matn = "salom"
natijalar = re.findall(
r".",
matn
)
print(
natijalar
)
Natija:
['s', 'a', 'l', 'o', 'm']
^¶
^ matn yoki satr boshini bildiradi.
import re
matn = "Python dasturlash tili."
if re.search(
r"^Python",
matn
):
print(
"Matn Python bilan boshlangan."
)
$¶
$ satr oxirini bildiradi.
import re
matn = "Softromeda Python."
if re.search(
r"Python\.$",
matn
):
print(
"Matn Python bilan tugagan."
)
*¶
* oldingi elementning 0 yoki undan ko'p marta takrorlanishini bildiradi.
import re
matn = "soooom"
natija = re.search(
r"so*m",
matn
)
if natija:
print(
"Naqsh topildi."
)
+¶
+ oldingi elementning 1 yoki undan ko'p marta takrorlanishini bildiradi.
import re
matn = "soooom"
natija = re.search(
r"so+m",
matn
)
if natija:
print(
"Naqsh topildi."
)
?¶
? oldingi elementning 0 yoki 1 marta bo'lishini bildiradi.
import re
matn = "color"
natija = re.search(
r"colou?r",
matn
)
if natija:
print(
"Naqsh topildi."
)
Bu naqsh:
color
colour
variantlariga mos kelishi mumkin.
{n}¶
Aniq takrorlanish sonini belgilash mumkin.
Masalan:
import re
matn = "12345"
natija = re.search(
r"\d{5}",
matn
)
if natija:
print(
"Besh xonali son topildi."
)
{n,m}¶
Element kamida n, ko'pi bilan m marta takrorlanishini bildiradi.
import re
matn = "1234567"
natija = re.search(
r"\d{3,5}",
matn
)
if natija:
print(
f"Topilgan son: {natija.group()}"
)
Belgilar to'plami¶
[] ichida kerakli belgilarni ko'rsatish mumkin.
import re
matn = "olma"
natija = re.search(
r"[abc]",
matn
)
if natija:
print(
f"Topilgan belgi: {natija.group()}"
)
[a-z]¶
Kichik lotin harflaridan birini topish:
import re
matn = "Softromeda"
natijalar = re.findall(
r"[a-z]",
matn
)
print(
natijalar
)
[A-Z]¶
Katta lotin harflaridan birini topish:
import re
matn = "Softromeda"
natijalar = re.findall(
r"[A-Z]",
matn
)
print(
natijalar
)
Natija:
['S']
[0-9]¶
Raqam topishning yana bir usuli:
import re
matn = "Softromeda 2026"
raqamlar = re.findall(
r"[0-9]",
matn
)
print(
raqamlar
)
[^...]¶
^ belgilar to'plami ichida ishlatilsa, "ushbu belgilar emas" ma'nosini beradi.
import re
matn = "123abc"
natijalar = re.findall(
r"[^0-9]",
matn
)
print(
natijalar
)
Natija:
['a', 'b', 'c']
Guruhlar¶
Regex'da () yordamida guruh yaratish mumkin.
Masalan:
import re
matn = "Softromeda 2026"
natija = re.search(
r"(\w+) (\d+)",
matn
)
if natija:
print(
f"To'liq natija: {natija.group(0)}"
)
print(
f"Birinchi guruh: {natija.group(1)}"
)
print(
f"Ikkinchi guruh: {natija.group(2)}"
)
Natija:
To'liq natija: Softromeda 2026
Birinchi guruh: Softromeda
Ikkinchi guruh: 2026
Guruhlarning amaliy qo'llanilishi¶
Telefon raqamini qismlarga ajratish mumkin.
import re
matn = "Telefon: +998 90 123 45 67"
naqsh = r"\+(\d{3}) (\d{2}) (\d{3}) (\d{2}) (\d{2})"
natija = re.search(
naqsh,
matn
)
if natija:
print(
f"Davlat kodi: {natija.group(1)}"
)
print(
f"Operator kodi: {natija.group(2)}"
)
print(
f"Asosiy raqam: "
f"{natija.group(3)}-{natija.group(4)}-{natija.group(5)}"
)
groups()¶
Barcha guruhlarni birgalikda olish mumkin.
import re
matn = "Softromeda 2026"
natija = re.search(
r"(\w+) (\d+)",
matn
)
if natija:
print(
natija.groups()
)
Natija:
('Softromeda', '2026')
Nomlangan guruhlar¶
Guruhga nom berish mumkin.
Sintaksis:
(?P<nom>naqsh)
Masalan:
import re
matn = "Ism: Ali, Yosh: 25"
naqsh = (
r"Ism: (?P<ism>\w+), "
r"Yosh: (?P<yosh>\d+)"
)
natija = re.search(
naqsh,
matn
)
if natija:
print(
f"Ism: {natija.group('ism')}"
)
print(
f"Yosh: {natija.group('yosh')}"
)
Natija:
Ism: Ali
Yosh: 25
sub()¶
sub() matn ichidagi mos keladigan qismlarni almashtiradi.
import re
matn = "Salom Ali. Ali Python o'rganmoqda."
yangi_matn = re.sub(
r"Ali",
"Softromeda",
matn
)
print(
yangi_matn
)
Natija:
Salom Softromeda. Softromeda Python o'rganmoqda.
Faqat raqamlarni almashtirish¶
import re
matn = "Softromeda 2026-yilda 15 ta loyiha yaratdi."
yangi_matn = re.sub(
r"\d+",
"[raqam]",
matn
)
print(
yangi_matn
)
Natija:
Softromeda [raqam]-yilda [raqam] ta loyiha yaratdi.
Bir nechta bo'sh joyni bitta bo'sh joyga almashtirish¶
import re
matn = "Softromeda Python dasturlashni o'rganmoqda."
tozalangan_matn = re.sub(
r"\s+",
" ",
matn
)
print(
tozalangan_matn
)
Natija:
Softromeda Python dasturlashni o'rganmoqda.
split()¶
re.split() regex naqshi bo'yicha matnni bo'lish imkonini beradi.
import re
matn = "olma,banan;anor:uzum"
mevalar = re.split(
r"[,;:]",
matn
)
print(
mevalar
)
Natija:
['olma', 'banan', 'anor', 'uzum']
compile()¶
Bir xil Regex naqshini ko'p marta ishlatish kerak bo'lsa, uni oldindan kompilyatsiya qilish mumkin.
import re
raqam_naqshi = re.compile(
r"\d+"
)
birinchi_matn = "Softromeda 2026"
ikkinchi_matn = "Python 3"
birinchi_natija = raqam_naqshi.findall(
birinchi_matn
)
ikkinchi_natija = raqam_naqshi.findall(
ikkinchi_matn
)
print(
birinchi_natija
)
print(
ikkinchi_natija
)
Natija:
['2026']
['3']
Email manzilni qidirish¶
Regex'ning amaliy qo'llanilishlaridan biri email manzillarni topishdir.
import re
matn = """
Aloqa: [email protected]
Qo'shimcha aloqa: [email protected]
"""
naqsh = (
r"[A-Za-z0-9._%+-]+"
r"@"
r"[A-Za-z0-9.-]+"
r"\.[A-Za-z]{2,}"
)
email_manzillar = re.findall(
naqsh,
matn
)
print(
f"Email manzillar: {email_manzillar}"
)
Natija:
Email manzillar: ['[email protected]', '[email protected]']
URL manzillarni topish¶
import re
matn = """
Softromeda sayti:
https://softromeda.uz
Python sayti:
https://python.org
"""
naqsh = (
r"https?://"
r"[A-Za-z0-9.-]+"
r"(?:/[A-Za-z0-9._~:/?#\[\]@!$&'()*+,;=-]*)?"
)
manzillar = re.findall(
naqsh,
matn
)
for manzil in manzillar:
print(
f"Topilgan manzil: {manzil}"
)
Telefon raqamini topish¶
import re
matn = """
Aloqa:
+998 90 123 45 67
+998 91 555 66 77
"""
naqsh = (
r"\+998\s"
r"\d{2}\s"
r"\d{3}\s"
r"\d{2}\s"
r"\d{2}"
)
telefon_raqamlari = re.findall(
naqsh,
matn
)
for telefon_raqami in telefon_raqamlari:
print(
f"Telefon: {telefon_raqami}"
)
Sana formatini tekshirish¶
Masalan:
2026-08-23
formatidagi sanani tekshirish:
import re
matn = "2026-08-23"
naqsh = r"^\d{4}-\d{2}-\d{2}$"
if re.fullmatch(
naqsh,
matn
):
print(
"Sana formati to'g'ri."
)
else:
print(
"Sana formati noto'g'ri."
)
fullmatch()¶
fullmatch() butun matn naqshga mos kelishini tekshiradi.
import re
matn = "12345"
if re.fullmatch(
r"\d+",
matn
):
print(
"Matn faqat raqamlardan iborat."
)
Bu search()dan farq qiladi.
search():
matnning bir qismidan moslik izlaydi
fullmatch():
butun matn mos kelishini talab qiladi
finditer()¶
finditer() barcha mosliklar uchun Match obyektlarini ketma-ket beradi.
import re
matn = "Softromeda 2026-yilda 15 ta loyiha yaratdi."
natijalar = re.finditer(
r"\d+",
matn
)
for natija in natijalar:
print(
f"Topildi: {natija.group()}"
)
print(
f"Boshlanishi: {natija.start()}"
)
Natija:
Topildi: 2026
Boshlanishi: ...
Topildi: 15
Boshlanishi: ...
Katta-kichik harflarni hisobga olmaslik¶
Regex'da re.IGNORECASE bayrog'idan foydalanish mumkin.
import re
matn = "Python PYTHON python PyThOn"
natijalar = re.findall(
r"python",
matn,
re.IGNORECASE
)
print(
natijalar
)
Natija:
['Python', 'PYTHON', 'python', 'PyThOn']
Ko'p qatorli matn¶
re.MULTILINE yordamida ^ va $ belgilarini har bir qator uchun ishlatish mumkin.
import re
matn = """Python
Java
Python
C++"""
natijalar = re.findall(
r"^Python$",
matn,
re.MULTILINE
)
print(
natijalar
)
Natija:
['Python', 'Python']
Nuqta bilan yangi qator¶
re.DOTALL ishlatilganda . yangi qator belgilarini ham qamrab olishi mumkin.
import re
matn = """Birinchi qator
Ikkinchi qator"""
natija = re.search(
r"Birinchi.*Ikkinchi",
matn,
re.DOTALL
)
if natija:
print(
"Naqsh topildi."
)
Raw string¶
Regex yozishda ko'pincha r"..." ko'rinishidan foydalaniladi.
Masalan:
naqsh = r"\d+"
Bu:
naqsh = "\\d+"
bilan bog'liq escape muammolarini kamaytiradi.
Shuning uchun Regex bilan ishlaganda:
r"\d+"
r"\w+"
r"\s+"
kabi raw stringlardan foydalanish odatiy hisoblanadi.
Amaliy matn tahlili¶
Keling, Softromeda haqidagi matndan ma'lumotlarni avtomatik ajratamiz.
import re
matn = """
Softromeda 2026-yilda yangi loyiha boshladi.
Aloqa: [email protected]
Telefon: +998 90 123 45 67
Sayt: https://softromeda.uz
Jamoada 25 nafar dasturchi ishlaydi.
"""
email_naqshi = (
r"[A-Za-z0-9._%+-]+"
r"@"
r"[A-Za-z0-9.-]+"
r"\.[A-Za-z]{2,}"
)
telefon_naqshi = (
r"\+998\s"
r"\d{2}\s"
r"\d{3}\s"
r"\d{2}\s"
r"\d{2}"
)
raqam_naqshi = r"\d+"
email_manzillar = re.findall(
email_naqshi,
matn
)
telefon_raqamlari = re.findall(
telefon_naqshi,
matn
)
raqamlar = re.findall(
raqam_naqshi,
matn
)
print(
f"Email manzillar: {email_manzillar}"
)
print(
f"Telefon raqamlari: {telefon_raqamlari}"
)
print(
f"Raqamlar: {raqamlar}"
)
Matnni tozalash¶
Regex matnni tozalashda ham juda foydali.
import re
matn = """
Softromeda Python
dasturlashni o'rganmoqda!!!
"""
tozalangan_matn = re.sub(
r"\s+",
" ",
matn
).strip()
tozalangan_matn = re.sub(
r"!+",
"!",
tozalangan_matn
)
print(
f"Tozalangan matn: {tozalangan_matn}"
)
Natija:
Tozalangan matn: Softromeda Python dasturlashni o'rganmoqda!
Amaliy loyiha — matn tahlilchisi¶
Quyidagi dastur matndan:
email
telefon
raqam
URL
ma'lumotlarini ajratib oladi.
import re
matn = """
Softromeda Python dasturlash bo'yicha kurs yaratmoqda.
Aloqa:
[email protected]
[email protected]
Telefonlar:
+998 90 123 45 67
+998 91 555 66 77
Saytlar:
https://softromeda.uz
https://python.org
Loyiha 2026-yilda boshlandi.
Jamoada 25 nafar dasturchi bor.
"""
email_naqshi = (
r"[A-Za-z0-9._%+-]+"
r"@"
r"[A-Za-z0-9.-]+"
r"\.[A-Za-z]{2,}"
)
telefon_naqshi = (
r"\+998\s"
r"\d{2}\s"
r"\d{3}\s"
r"\d{2}\s"
r"\d{2}"
)
url_naqshi = (
r"https?://"
r"[A-Za-z0-9.-]+"
r"(?:/[A-Za-z0-9._~:/?#\[\]@!$&'()*+,;=-]*)?"
)
raqam_naqshi = r"\d+"
email_manzillar = re.findall(
email_naqshi,
matn
)
telefon_raqamlari = re.findall(
telefon_naqshi,
matn
)
url_manzillar = re.findall(
url_naqshi,
matn
)
raqamlar = re.findall(
raqam_naqshi,
matn
)
print(
"=== MATN TAHLILI ==="
)
print(
f"Email soni: {len(email_manzillar)}"
)
for email_manzil in email_manzillar:
print(
f"Email: {email_manzil}"
)
print(
f"Telefon soni: {len(telefon_raqamlari)}"
)
for telefon_raqami in telefon_raqamlari:
print(
f"Telefon: {telefon_raqami}"
)
print(
f"URL soni: {len(url_manzillar)}"
)
for url_manzil in url_manzillar:
print(
f"URL: {url_manzil}"
)
print(
f"Topilgan raqamlar: {raqamlar}"
)
Bu kichik loyiha real dasturlarda Regex qanday ishlatilishini ko'rsatadi.
Regex bilan ishlashda muhim qoida¶
Regex juda kuchli vosita, lekin murakkab naqshlarni yozishda ehtiyot bo'lish kerak.
Masalan:
r"\d+"
juda sodda.
Lekin:
r"(?P<ism>[A-Za-z]+)\s+(?P<yosh>\d+)"
kabi naqshlar murakkabroq bo'ladi.
Regex'ni tushunarli qilish uchun:
raw string
nomlangan guruhlar
alohida o'zgaruvchilar
izohlar
dan foydalanish foydali.
Amaliy mashqlar¶
Mashq 1¶
Matndan barcha raqamlarni toping.
Softromeda 2026-yilda 15 ta loyiha va 25 ta modul yaratdi.
Mashq 2¶
Matndan barcha email manzillarni toping.
Mashq 3¶
Matndan barcha telefon raqamlarini toping.
Mashq 4¶
Matndan barcha URL manzillarni toping.
Mashq 5¶
Matndagi barcha Python so'zlarini toping.
Mashq 6¶
Matn boshida Softromeda borligini match() yordamida tekshiring.
Mashq 7¶
Matndan ketma-ket bir nechta bo'sh joylarni bitta bo'sh joyga almashtiring.
Mashq 8¶
Matndagi barcha raqamlarni [raqam] bilan almashtiring.
Mashq 9¶
Regex guruhlaridan foydalanib quyidagi matndan ism va yoshni ajrating:
Ism: Ali, Yosh: 25
Mashq 10¶
Matndan quyidagi ma'lumotlarni avtomatik ajratadigan dastur yarating:
Email
Telefon
URL
Sana
Raqam
Bob xulosasi¶
Bu bobda Python'da muntazam ifodalar bilan ishlashni o'rgandik.
Asosiy modul:
import re
Asosiy funksiyalar:
match()
search()
findall()
finditer()
sub()
split()
fullmatch()
compile()
Muhim Regex belgilar:
\d → raqam
\D → raqam emas
\w → so'z belgisi
\W → so'z belgisi emas
\s → bo'sh joy
. → istalgan belgi
^ → bosh
$ → oxir
* → 0 yoki undan ko'p
+ → 1 yoki undan ko'p
? → 0 yoki 1
{n} → aniq n marta
{n,m} → n dan m gacha
[] → belgilar to'plami
() → guruh
Regex yordamida matnni:
qidirish
tekshirish
ajratish
almashtirish
tozalash
tahlil qilish
mumkin.
Keyingi bobda 15. Sana, vaqt va kalendar bilan ishlash mavzusini o'rganamiz.