Обяснение на Python Regex (2026)
Regex е най-страшната функция на Python. Не е толкова трудно — но 80% от уроците зареждат теорията отпред (\d, \w, алчен срещу мързелив), преди да ви покажат един шаблон, който всъщност бихте използвали в реален код. Този урок обръща това.
Ще разгледаме: основите на re модула, петте шаблона, които покриват 90% от реалната работа, кога re.compile действително помага, именувани групи срещу номерирани и четирите случая, в които regex е ГРЕШНИЯТ инструмент.
Модулът за 60 секунди
Всичко живее в модула re на stdlib. Три функции покриват повечето нужди:
Правило: използвайте „re.search“, когато се съмнявате. re.match проверява само началото; забравянето, което води до "моят регулярен израз не съвпада!" 30 минути загубени.
Сурови низове - винаги ги използвайте
Префиксът r"..." деактивира интерпретацията на обратната наклонена черта. Без него "\d" става "\\d" в Python, което системата за регулярни изрази вижда като \d — същият резултат, но само случайно и само за \d. "\n" в регулярен израз е нов ред, а не двата знака + n`.
Мускулна памет: всеки регулярен израз започва с „r“. Без изключения.
5-те модела, които покриват 90% от реалната работа
1. Извличане на всички цели числа от текста
Забележка 199.99 се разделя на ['199', '99'] — \d+ не пресича точката. Използвайте r"\d+(?:\.\d+)?" за незадължителни десетични знаци:
2. Нормализиране на празното пространство
\s+ съвпада с всяка поредица от интервали / раздели / нови редове. Заменете с един интервал, махнете краищата. Това е отговорът на Python на sed -E 's/[[:space:]]+/ /g'.
3. Извлечете името на хоста от URL
Скобите създават група за улавяне; .group(1) връща съдържанието му. [^/:]+ = "един или повече знаци, които не са / или :" — спира на разделителя на порта ИЛИ на пътя.
За производствен анализ на URL използвайте urllib.parse.urlparse (обработва крайни случаи като userinfo + IPv6). Regex е за бързо и мръсно извличане.
4. Разхлабено валидиране на имейл
НЯМА регулярен израз, който да валидира напълно имейлите според RFC 5322. Всеки, който ви каже обратното, продава нещо. Но този улавя 99% от реалните адреси без фалшиво отхвърляне на добрите:
Котвите (^ и $) принуждават съвпадение на пълен низ. Без тях "foo@bar" в по-голямо изречение би съвпадало.
Производство: изпратете имейл за потвърждение. Това е ЕДИНСТВЕНИЯТ надежден имейл валидатор.
5. Именувани групи за улавяне
Номерираните групи ((...) + .group(1)) са подходящи за 2-3 заснемания. Освен това имената печелят:
.groupdict() връща dict на всички именувани групи. Добавяне/пренареждане на групи, без да прекъсвате всеки сайт за обаждания, който препраща към .group(3).
re.compile — когато наистина помага
stdlib поддържа малък кеш на компилиран модел (размер по подразбиране 512), така че еднократните re.search(pattern, text) извиквания са ефективно безплатни след първото попадение. re.compile изрично помага, когато:
1. Шаблонът се използва в стегнат цикъл (милиони съвпадения).
2. Искате да съхраните модела като константа на ниво модул за възможност за grep.
3. Имате нужда от .finditer(), .pattern, .flags на компилирания обект.
Не прекалявайте с компилирането. Всеки re.compile на ниво модул добавя малък разход за време за импортиране.
Общи флагове
Комбинирайте с |: re.IGNORECASE | re.MULTILINE.
Когато регулярният израз е ГРЕШЕН инструмент
1. Анализирайте HTML / XML → използвайте истински анализатор
Класическият отговор на Stack Overflow за това е на 20 години и все още е верен.
2. Анализ на JSON → използвайте json
Модулът json обработва вложени кавички, екранирани символи, Unicode и всеки RFC 8259 edge case. Анализът на регулярни изрази JSON е сигнал за анти-модел.
3. Парсиране на дати → използвайте dateutil или datetime.strptime
dateutil.parser.parse("2026-07-30") приема всеки формат, който човек може да въведе. datetime.strptime обработва известни формати ефективно. И двете обработват часови зони. Regex ще трябва да преоткрие всичко това.
4. Вложени / рекурсивни модели → използвайте генератор на анализатори
Съвпадащите скоби, вложените JSON, балансираните изрази формално са извън силата на регулярния израз (безконтекстна граматична територия). Използвайте pyparsing / lark / ANTLR — или просто обходете низа с малък анализатор.
Отстраняване на грешки регулярен израз
Използвайте regex101.com (изберете вкус "Python"). Залепете модела + примерен текст; подчертава съвпаденията в реално време, обяснява всеки метасимвол и показва именувани групи. Най-бързият начин да научите регулярен израз интуитивно.
За отстраняване на грешки на ниво код, re.DEBUG отпечатва компилираната държавна машина:
Практикувайте
Напишете регулярен израз за всеки. Решения по-долу.
1. Извлечете номера на версията от „Python 3.13.2 (основен, 15 януари 2026 г., 10:32:11)“ — трябва да върне „3.13.2“.
2. Разделете „ябълка, банан; череша, портокал“ на който и да е разделител (,, ; или интервал).
3. Препишете foo.bar_baz-123 като FOO.BAR_BAZ-123 (само главни букви, оставете цифрите и препинателните знаци).
Решения:
Regex е суперсила, след като преминете през първите 10 модела. Номерът е да изградите мускулна памет върху петте по-горе - те покриват 90% от реалната работа. Посегнете за истински анализатор в момента, в който откриете, че пишете обратни препратки, за да балансирате скоби.
Следваща стъпка: регулярни изрази + уроци за обработка на текст в трака за автоматизация — тренирайте върху регистрационни файлове, CSV данни и задачи за уеб скрапинг с истински Python, работещ във вашия браузър.