Regulární výrazy prakticky – regex tahák s příklady
Regulární výrazy bez strachu – syntaxe, skupiny, příklady pro PSČ, telefon a logy, použití v Pythonu, JavaScriptu a grepu a nejčastější pasti.
Regulární výrazy (regex) jsou malý jazyk pro hledání vzorů v textu. Vypadají jako šum, ale stačí znát pár stavebních kamenů a pokryjete většinu běžných úloh: validaci vstupu, vyhledávání v logech, hromadné přejmenování nebo úpravu dat v editoru.
Základní stavební kameny
| Zápis | Význam | Příklad |
|---|---|---|
. |
jakýkoli znak (kromě nového řádku) | a.c → abc, a-c |
\d |
číslice | \d\d → 42 |
\w |
„slovní“ znak (písmeno, číslice, _) |
\w+ → slovo |
\s |
bílý znak (mezera, tab, nový řádek) | \s+ |
[abc] |
jeden ze znaků | [aeiou] |
[^abc] |
žádný z uvedených znaků | [^0-9] |
^ / $ |
začátek / konec řetězce (nebo řádku v multiline režimu) | ^ERROR |
\b |
hranice slova | \bkočka\b |
Kvantifikátory
| Zápis | Počet |
|---|---|
* |
0 a více |
+ |
1 a více |
? |
0 nebo 1 |
{3} |
přesně 3 |
{2,4} |
2 až 4 |
{2,} |
2 a více |
Skupiny a alternativy
(abc)– zachytávající skupina, hodnotu lze použít později.(?:abc)– nezachytávající skupina, jen pro seskupení.(?P<rok>\d{4})v Pythonu /(?<rok>\d{4})v JS – pojmenovaná skupina.kočka|pes– jedna nebo druhá varianta.
Praktické příklady
České PSČ
^\d{3} ?\d{2}$
Přijme 11000 i 110 00.
Telefon ve tvaru +420
^(?:\+420)? ?\d{3} ?\d{3} ?\d{3}$
Přijme +420 777 123 456, 777123456. Kontroluje formát, ne existenci čísla.
Datum RRRR-MM-DD
^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
Pozor: regex nepozná, že 2026-02-31 neexistuje. Na skutečnou validaci data použijte parser (datetime.strptime, Date).
IP adresa z řádku access logu Nginx
^(\d{1,3}(?:\.\d{1,3}){3}) .*" (\d{3})
Skupina 1 = IP, skupina 2 = stavový kód.
Regex pro plně korektní e-mail podle RFC je nepraktický. V praxi stačí základní kontrola a pak ověřovací e-mail:
^[^\s@]+@[^\s@]+\.[^\s@]+$
Regex v Pythonu
import re
text = "Faktura 2026-0142 ze dne 2026-03-15, splatnost 2026-03-29"
# Všechna data
re.findall(r"\d{4}-\d{2}-\d{2}", text)
# ['2026-03-15', '2026-03-29']
# Pojmenované skupiny
m = re.search(r"Faktura (?P<cislo>\d{4}-\d{4})", text)
m.group("cislo") # '2026-0142'
# Nahrazení se zpětným odkazem: RRRR-MM-DD → DD. MM. RRRR
re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\3. \2. \1", text)
# Celý řetězec musí odpovídat
re.fullmatch(r"\d{3} ?\d{2}", "110 00") is not None # True
Vždy používejte raw string r"...", jinak se \d nebo \b mohou interpretovat jako escape sekvence Pythonu (\b je backspace!).
Užitečné příznaky: re.IGNORECASE, re.MULTILINE (^/$ pro každý řádek), re.VERBOSE (umožní komentáře a mezery v regexu).
Regex v JavaScriptu
const text = 'Faktura 2026-0142 ze dne 2026-03-15';
// Všechny výskyty se skupinami
for (const m of text.matchAll(/(\d{4})-(\d{2})-(\d{2})/g)) {
console.log(m[0], m[1]);
}
// Nahrazení
text.replace(/(\d{4})-(\d{2})-(\d{2})/g, '$3. $2. $1');
// Test
/^\d{3} ?\d{2}$/.test('110 00'); // true
Pro české znaky se hodí příznak u a Unicode třídy: /\p{L}+/u najde slova včetně diakritiky. Pozor na příznak g u .test() – regex si pamatuje lastIndex a opakované volání může vracet střídavě true a false.
Regex na příkazové řádce
# Řádky s ERROR nebo CRITICAL
grep -E "ERROR|CRITICAL" app.log
# Jen odpovídající část – IP adresy a jejich četnost
grep -oE "^[0-9]{1,3}(\.[0-9]{1,3}){3}" access.log | sort | uniq -c | sort -rn | head
# Perl-kompatibilní regex v GNU grep
grep -oP "user_id=\K\d+" app.log
# Nahrazení v souboru (GNU sed)
sed -E -i 's/http:\/\/example\.cz/https:\/\/example.cz/g' config.txt
grep -E používá rozšířenou syntaxi (ERE), která nezná \d – proto [0-9]. grep -P (PCRE) \d umí, ale není dostupný v BSD grep na macOS.
Nejčastější pasti
- Hladový kvantifikátor.
<.*>na textu<b>tučně</b>zachytí celé<b>tučně</b>. Líná varianta<.*?>zachytí<b>. - Zapomenuté kotvy.
\d{5}najde pět číslic i uvnitř123456789. Pro validaci celého vstupu použijte^…$nebofullmatch. - Neescapovaná tečka.
example.czodpovídá iexampleXcz. Správněexample\.cz. - Katastrofický backtracking. Vnořené kvantifikátory jako
(a+)+$mohou na dlouhém vstupu běžet extrémně dlouho (ReDoS). Na uživatelském vstupu se jim vyhněte. - Parsování HTML nebo JSON regexem. Pro strukturovaná data použijte parser (BeautifulSoup,
json,jq).
Jak regex ladit
Používejte online testery jako regex101.com – vysvětlí každou část výrazu, ukáže skupiny a umí přepínat mezi dialekty (PCRE, Python, JavaScript). A vždy si připravte sadu vstupů, které mají projít, i těch, které projít nemají.