Wyjaśnienie wyrażenia regularnego w języku Python (2026)
Regex to najbardziej przerażająca funkcja Pythona. Nie jest to takie trudne — ale 80% samouczków ładuje teorię od początku (\d, \w, zachłanny vs leniwy), zanim pokaże ci pojedynczy wzorzec, którego faktycznie użyłbyś w prawdziwym kodzie. Ten samouczek to odwraca.
Omówimy: podstawy modułu „re”, pięć wzorców pokrywających 90% rzeczywistej pracy, kiedy „re.compile” faktycznie pomaga, grupy nazwane a numerowane oraz cztery przypadki, w których wyrażenie regularne jest ZŁYM narzędziem.
Moduł w 60 sekund
Wszystko znajduje się w module stdlib re. Trzy funkcje zaspokajają większość potrzeb:
Reguła: w razie wątpliwości użyj opcji „re.search”. re.match sprawdza tylko początek; zapomnienie o tym prowadzi do „moje wyrażenie regularne nie pasuje!” Stracone 30 minut.
Surowe ciągi znaków — zawsze ich używaj
Przedrostek r"..." wyłącza interpretację ukośnika odwrotnego. Bez tego "\d" staje się "\\d" w Pythonie, co silnik regex widzi jako \d — ten sam wynik, ale tylko przez przypadek i tylko dla \d. "\n" w wyrażeniu regularnym oznacza nową linię, a nie dwa znaki ` + n`.
Pamięć mięśniowa: każdy literał wyrażenia regularnego zaczyna się od „r”. Żadnych wyjątków.
5 wzorców, które pokrywają 90% prawdziwej pracy
1. Wyodrębnij wszystkie liczby całkowite z tekstu
Uwaga 199,99 dzieli się na ['199', '99'] — \d+ nie przecina kropki. Użyj r"\d+(?:\.\d+)?" dla opcjonalnych miejsc dziesiętnych:
2. Normalizuj białe znaki
\s+ dopasowuje dowolny ciąg spacji/tabulacji/nowej linii. Zastąp pojedynczą spacją, usuń krawędzie. To jest odpowiedź Pythona na sed -E 's/[[:space:]]+/ /g'.
3. Wyodrębnij nazwę hosta z adresu URL
Nawiasy tworzą grupę przechwytywania; .group(1) zwraca jego zawartość. [^/:]+ = "jeden lub więcej znaków innych niż / lub :" — zatrzymuje się na separatorze portu LUB ścieżce.
Do produkcyjnego analizowania adresów URL użyj urllib.parse.urlparse (obsługuje przypadki brzegowe, takie jak informacje o użytkowniku + IPv6). Regex służy do szybkiej i brudnej ekstrakcji.
4. Luźna weryfikacja adresu e-mail
NIE ma wyrażenia regularnego, które w pełni sprawdza wiadomości e-mail zgodnie z RFC 5322. Każdy, kto twierdzi inaczej, coś sprzedaje. Ale ten przechwytuje 99% prawdziwych adresów bez fałszywego odrzucania dobrych:
Kotwice (^ i $) wymuszają dopasowanie pełnego łańcucha. Bez nich pasowałoby „foo@bar” w większym zdaniu.
Produkcja: wyślij e-mail z potwierdzeniem. To JEDYNY niezawodny weryfikator poczty e-mail.
5. Nazwane grupy przechwytujące
Numerowane grupy ((...) + .group(1)) wystarczą na 2-3 przechwytywania. Poza tym wygrywają imiona:
.groupdict() zwraca dykt wszystkich nazwanych grup. Dodawaj/zmieniaj kolejność grup bez przerywania każdej witryny wywołań, która odwołuje się do .group(3).
re.compile — kiedy to faktycznie pomaga
Biblioteka stdlib przechowuje małą pamięć podręczną ze skompilowanymi wzorami (domyślny rozmiar 512), więc jednorazowe wywołania re.search(pattern, tekst) są faktycznie bezpłatne po pierwszym trafieniu. re.compile wyraźnie pomaga, gdy:
1. Wzór jest używany w ciasnej pętli (miliony dopasowań).
2. Chcesz zapisać wzorzec jako stałą na poziomie modułu dla możliwości grep.
3. Potrzebujesz .finditer(), .pattern, .flags na skompilowanym obiekcie.
Nie przekompiluj. Każde polecenie „re.compile” na poziomie modułu dodaje niewielki koszt czasu importu.
Wspólne flagi
Połącz z |: re.IGNORECASE | re.MULTILINE.
Gdy wyrażenie regularne jest ZŁYM narzędziem
1. Parsowanie HTML / XML → użyj prawdziwego parsera
Klasyczna odpowiedź na to Stack Overflow ma 20 lat i nadal jest prawdziwa.
2. Parsowanie JSON → użyj json
Moduł json obsługuje zagnieżdżone cudzysłowy, znaki ucieczki, Unicode i każdy przypadek brzegowy RFC 8259. JSON analizujący wyrażenie regularne jest sygnałem antywzorcowym.
3. Analizowanie dat → użyj dateutil lub datetime.strptime
dateutil.parser.parse("2026-07-30") akceptuje każdy format, jaki może wpisać człowiek. datetime.strptime efektywnie obsługuje znane formaty. Obydwa obsługują strefy czasowe. Regex musiałby to wszystko wymyślić na nowo.
4. Wzorce zagnieżdżone/rekurencyjne → użyj generatora parsera
Dopasowane pareny, zagnieżdżone JSON i zrównoważone wyrażenia są formalnie poza zasięgiem wyrażenia regularnego (terytorium gramatyki bezkontekstowej). Użyj pyparsing / lark / ANTLR — lub po prostu przejdź po łańcuchu za pomocą małego parsera.
Debugowanie wyrażenia regularnego
Użyj regex101.com (wybierz smak „Python”). Wklej wzór + przykładowy tekst; podkreśla dopasowania w czasie rzeczywistym, wyjaśnia każdy metaznak i pokazuje nazwane grupy. Najszybszy sposób na intuicyjną naukę wyrażeń regularnych.
W przypadku debugowania na poziomie kodu re.DEBUG wypisuje skompilowaną maszynę stanu:
Ćwicz
Napisz wyrażenie regularne dla każdego. Rozwiązania poniżej.
1. Wyodrębnij numer wersji z `Python 3.13.2 (main, 15 stycznia 2026, 10:32:11)" — powinien zwrócić ``3.13.2''.
2. Podziel `jabłko,banan;wiśniowa pomarańcza' na dowolnym ograniczniku (,, ; lub spacja).
3. Przepisz foo.bar_baz-123 na FOO.BAR_BAZ-123 (tylko wielkie litery, zostaw cyfry i znaki interpunkcyjne).
Rozwiązania:
Regex staje się supermocą, gdy przekroczysz pierwsze 10 wzorców. Sztuka polega na budowaniu pamięci mięśniowej na pięciu powyższych – pokrywają one 90% prawdziwej pracy. Sięgnij po prawdziwy parser, gdy tylko zauważysz, że piszesz odniesienia wsteczne, aby zrównoważyć parery.
Następny krok: lekcje wyrażeń regularnych + przetwarzania tekstu na ścieżce Automation — ćwicz pliki dziennika, dane CSV i zadania przeglądania stron internetowych, korzystając z prawdziwego języka Python działającego w przeglądarce.