Python / Тогтмол илэрхийлэл (RegExp)

Тогтмол илэрхийлэл (RegExp)

Мөрөөс и-мэйл хаяг олох, утасны дугаар баталгаажуулах, текстийн хэсгийг орлуулах зэрэг ажлыг хийхэд regular expression (regex) маш хүчирхэг хэрэгсэл. Python-д re модуль ашигладаг. Эхлэгчдэд regex хачирхалтай харагддаг — тэвчээртэй байгаарай, дадвал асуудалгүй болно!

re модуль ба үндсэн функцүүд

python
import re

текст = "Миний и-мэйл: bold@example.mn гэж байна."

# search — тохирол хайна (эхний тохирол)
үр_дүн = re.search(r"\w+@\w+\.\w+", текст)
if үр_дүн:
    print(үр_дүн.group())   # bold@example.mn

# findall — бүх тохирлыг жагсаалтаар буцаана
бүгд = re.findall(r"\w+", "Сайн уу дэлхий")
print(бүгд)   # ['Сайн', 'уу', 'дэлхий']

r"..." нь raw string\n, \t гэх мэт тусгай тэмдэгтийг literal байдлаар авна. Regex-д заавал r ашиглах нь зүй ёсны дадал.

Regex хэв загварын үндэс

Хамгийн чухал тэмдэгтүүдийг цээжилбэл:

| Тэмдэгт | Утга | | --- | --- | | . | Ямар ч нэг тэмдэгт (шинэ мөрөөс бусад) | | \d | Цифр (0–9) | | \w | Үсэг, цифр, доогуур зураас | | \s | Зай, tab, шинэ мөр | | * | 0 буюу түүнээс олон | | + | 1 буюу түүнээс олон | | ? | 0 эсвэл 1 | | ^ | Мөрийн эхлэл | | $ | Мөрийн төгсгөл | | [abc] | a, b, эсвэл c | | (abc) | Бүлэг (group) |

python
import re

# Цифр олох
print(re.findall(r"\d+", "2024 онд 50 сурагч"))   # ['2024', '50']

# И-мэйл хэв загвар баталгаажуулах
и_мэйл = "test@example.com"
if re.match(r"^[\w.]+@[\w.]+\.\w{2,}$", и_мэйл):
    print("Зөв и-мэйл")

Орлуулах ба задлах

re.sub() нь тохирсон хэсгийг орлуулна. re.groups() нь бүлгүүдийг задална.

python
import re

# sub — орлуулах
текст = "Утас: 99112233, нэмэлт: 88001122"
цэвэрлэсэн = re.sub(r"\d+", "***", текст)
print(цэвэрлэсэн)   # Утас: ***, нэмэлт: ***

# Бүлэг ашиглан задлах
огноо = "2024-05-15"
тааруулсан = re.match(r"(\d{4})-(\d{2})-(\d{2})", огноо)
if тааруулсан:
    жил, сар, өдөр = тааруулсан.groups()
    print(f"Жил: {жил}, Сар: {сар}, Өдөр: {өдөр}")
    # Жил: 2024, Сар: 05, Өдөр: 15

compile — хэв загварыг урьдчилан бэлтгэх

Нэг хэв загварыг олон удаа ашиглах бол re.compile() ашиглах нь хурдасгана:

python
import re

# Хэв загварыг нэг удаа compile хийнэ
и_мэйл_хэв = re.compile(r"^[\w.+-]+@[\w-]+\.[a-z]{2,}$", re.IGNORECASE)

и_мэйлүүд = [
    "bold@example.mn",
    "сайн_уу",
    "test.user+tag@gmail.com",
    "@хоосон.com"
]

for и_мэйл in и_мэйлүүд:
    хүчинтэй = "✓" if и_мэйл_хэв.match(и_мэйл) else "✗"
    print(f"{хүчинтэй} {и_мэйл}")

# ✓ bold@example.mn
# ✗ сайн_уу
# ✓ test.user+tag@gmail.com
# ✗ @хоосон.com

re.IGNORECASE нь том, жижиг үсгийг ялгахгүй болгодог flag. Бусад хэрэгтэй flag: re.MULTILINE (олон мөрт), re.DOTALL (. нь шинэ мөр ч тааруулна).

Regex бол ямар ч хэлэнд хэрэглэгддэг стандарт хэрэгсэл — Python-д сурсан зүйлээ JavaScript, Go, Java дээр ч ашиглаж болно.

Дараагийн хичээлд:

JSON ба CSV өгөгдөл — бодит ертөнцийн хамгийн түгээмэл файлын форматуудтай Python-д хэрхэн ажиллах, задлах, бичих талаар үзнэ.