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() 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.