Programování

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.

12. 10. 2026 · 4 min čtení

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.

E-mail

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

  1. Hladový kvantifikátor. <.*> na textu <b>tučně</b> zachytí celé <b>tučně</b>. Líná varianta <.*?> zachytí <b>.
  2. Zapomenuté kotvy. \d{5} najde pět číslic i uvnitř 123456789. Pro validaci celého vstupu použijte ^…$ nebo fullmatch.
  3. Neescapovaná tečka. example.cz odpovídá i exampleXcz. Správně example\.cz.
  4. 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.
  5. 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í.