Python Regex Explained (2026)
Regex este cea mai de temut caracteristică a lui Python. Nu este atât de greu – dar 80% dintre tutoriale încărcează teoria (\d, \w, lacom vs leneș) înainte de a vă arăta un singur model pe care l-ați folosi de fapt în codul real. Acest tutorial inversează asta.
Vom acoperi: elementele de bază ale modulului re, cele cinci modele care acoperă 90% din munca reală, când re.compile ajută de fapt, grupurile numite vs numerotate și cele patru cazuri în care regex este instrumentul GREȘIT.
Modulul în 60 de secunde
Totul trăiește în modulul stdlib re. Trei funcții acoperă majoritatea nevoilor:
Regulă: folosiți re.search atunci când aveți îndoieli. re.match verifică doar începutul; uitând asta duce la „reexexul meu regex nu se potrivește!” 30 de minute pierdute.
Corzi brute — folosește-le întotdeauna
Prefixul r"... dezactivează interpretarea backslash. Fără el, "\d" devine "\\d" în Python, pe care motorul regex îl vede ca \d — același rezultat, dar numai accidental și numai pentru \d. "\n" într-un regex este o linie nouă, nu cele două caractere ` + n`.
Memoria musculară: fiecare literal regex începe cu r. Fără excepții.
Cele 5 modele care acoperă 90% din munca reală
1. Extrage toate numerele întregi din text
Rețineți că 199.99 se împarte în ['199', '99'] — \d+ nu încrucișează punctul. Folosiți r"\d+(?:\.\d+)?" pentru zecimale opționale:
2. Normalizați spațiul alb
\s+ se potrivește cu orice rulare de spații / file / linii noi. Înlocuiți cu un singur spațiu, îndepărtați marginile. Acesta este răspunsul lui Python la sed -E 's/[[:space:]]+/ /g'.
3. Extrageți numele gazdei dintr-o adresă URL
Parantezele creează un grup de captură; .group(1) returnează conținutul său. [^/:]+ = „unul sau mai multe caractere care nu sunt / sau :” — se oprește la separatorul de porturi SAU la cale.
Pentru analiza URL de producție, utilizați urllib.parse.urlparse (se ocupă de cazurile marginale, cum ar fi userinfo + IPv6). Regex este pentru extragerea rapidă și murdară.
4. Validare liberă de e-mail
Nu există expresii regex care să valideze complet e-mailurile conform RFC 5322. Oricine vă spune altfel vinde ceva. Dar aceasta prinde 99% din adresele reale fără a le respinge fals pe cele bune:
Ancorele (^ și $) forțează potrivirea întregului șir. Fără ele, "foo@bar" dintr-o propoziție mai mare s-ar potrivi.
Producție: trimiteți un e-mail de confirmare. Acesta este SINGURUL validator de e-mail de încredere.
5. Grupuri de captură denumite
Grupurile numerotate ((...) + .group(1)) sunt bune pentru 2-3 capturi. Dincolo de asta, numele câștigă:
.groupdict() returnează un dict al tuturor grupurilor numite. Adăugați/reordonați grupuri fără a întrerupe fiecare site de apel care se referă la .group(3).
re.compile — când chiar ajută
Stdlib menține un mic cache cu modele compilate (dimensiunea implicită 512), astfel încât apelurile unice „re.search(pattern, text)” sunt efectiv libere după prima lovitură. re.compile ajută în mod explicit când:
1. Modelul este folosit în interiorul unei bucle strânse (milioane de potriviri).
2. Doriți să stocați modelul ca o constantă la nivel de modul pentru grep-ability.
3. Aveți nevoie de .finditer(), .pattern, .flags pe obiectul compilat.
Nu supracompilați. Fiecare re.compile la nivel de modul adaugă un cost mic de timp de import.
Steaguri comune
Combinați cu |: re.IGNORECASE | re.MULTILINE.
Când regex este instrumentul GREȘIT
1. Analizarea HTML / XML → utilizați un parser real
Răspunsul clasic Stack Overflow pentru aceasta are 20 de ani și încă este adevărat.
2. Analizarea JSON → utilizați json
Modulul json se ocupă de ghilimele imbricate, caracterele escape, Unicode și fiecare caz marginal RFC 8259. Regex-parsing JSON este un semnal anti-model.
3. Analizarea datelor → utilizați dateutil sau datetime.strptime
dateutil.parser.parse("2026-07-30") acceptă fiecare format pe care un om îl poate introduce. datetime.strptime gestionează eficient formatele cunoscute. Ambele se ocupă de fusurile orare. Regex ar trebui să reinventeze totul.
4. Modele imbricate / recursive → utilizați un generator de analiză
Parenți potriviți, JSON imbricat, expresii echilibrate sunt în mod formal dincolo de puterea regex-ului (teritoriu de gramatică fără context). Utilizați pyparsing / lark / ANTLR — sau pur și simplu parcurgeți șirul cu un mic parser.
Depanare regex
Folosiți regex101.com (alegeți aroma „Python”). Lipiți modelul + exemplu de text; evidențiază potrivirile în timp real, explică fiecare metacaracter și arată grupurile numite. Cel mai rapid mod de a învăța intuitiv regex.
Pentru depanarea la nivel de cod, re.DEBUG tipărește mașina de stare compilată:
Practică
Scrieți un regex pentru fiecare. Soluții de mai jos.
1. Extrageți numărul versiunii din "Python 3.13.2 (principal, 15 ianuarie 2026, 10:32:11)" — ar trebui să returneze "3.13.2".
2. Împărțiți „„măr, banană; portocală cireșă”” pe orice delimitator (,, ; sau spațiu).
3. Rescrieți foo.bar_baz-123 ca FOO.BAR_BAZ-123 (numai cu litere mari, lăsați cifre și semne de punctuație).
Soluții:
Regex este o superputere odată ce depășiți primele 10 modele. Trucul este să construiți memoria musculară pe cele cinci de mai sus - acopera 90% din munca reală. Ajungeți la un analizator real în momentul în care vă treziți să scrieți referințe pentru a echilibra părinții.
Următorul pas: regex + lecții de procesare a textului în pista Automatizare — exersați pe fișierele jurnal, datele CSV și sarcinile de web-scraping cu Python real care rulează în browser.