Тогтмол илэрхийлэл (RegExp)
Мөрөөс и-мэйл хаяг олох, утасны дугаар баталгаажуулах, текстийн хэсгийг орлуулах зэрэг ажлыг хийхэд regular expression (regex) маш хүчирхэг хэрэгсэл. Python-д re модуль ашигладаг. Эхлэгчдэд regex хачирхалтай харагддаг — тэвчээртэй байгаарай, дадвал асуудалгүй болно!
re модуль ба үндсэн функцүүд
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) |
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() нь бүлгүүдийг задална.
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() ашиглах нь хурдасгана:
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-д хэрхэн ажиллах, задлах, бичих талаар үзнэ.