Skip to content

Commit 150cbae

Browse files
committed
Rozdeleni kapitoly Regulární výrazy na dve sekce
1 parent 3c9650c commit 150cbae

File tree

3 files changed

+132
-133
lines changed

3 files changed

+132
-133
lines changed

ziskavani-dat/regularni-vyrazy/entry.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ title: Regulární výrazy
22
lead: Ovládneme regulární výrazy, které nám umožní dělat kouzla při dolování dat z textů.
33
sections:
44
- regularni-vyrazy
5+
- python-re
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
## Regulární výrazy v Pythonu
2+
3+
V Pythonu máme řadu funkcí, které můžeme použít pro práci s regulárními výrazy. Projdeme si ty základní. Funkce jsou v modulu `re`, který je součástí Pythonu a můžeš ho importovat pomocí příkazu `import re` na začátku programu.
4+
5+
### Ověření formátu
6+
7+
Často potřebujeme ověřit, jestli máme zadaná data ve správném formátu. Např. telefonní čísla, rodná čísla, ISBN u knih, poštovní směrovací čísla, e-maily nebo čísla bankovního účtu mají jasně definovaný formát.
8+
9+
Zkusme si nejprve zadat rodné číslo. Víme, že rodné číslo se skládá ze 6 číslic, které kódují datum narození, a tří nebo čtyř číslic, které identifikují konkrétního člověka. Regulární výraz, který by číslo ověřil, je `\d{9,10}`.
10+
11+
Regulární výraz můžeme vytvořit pomocí funkce `compile()` z modulu `re`. Před řetězec s regulárními výrazy píšeme `r`, abychom Pythonu dali vědět, co je daný řetězec zač.
12+
13+
```py
14+
import re
15+
regularniVyraz = re.compile(r"\d{9,10}")
16+
17+
rezetec = "9511121234"
18+
print(regularniVyraz.match(rezetec))
19+
rezetec = "ahoj"
20+
print(regularniVyraz.match(rezetec))
21+
```
22+
23+
Pokud funkce `match` došla k závěru, že se řetězec shoduje s regulárním výrazem, vrátí objekt `Match`. S ním později budeme pracovat. Pokud by však funkce došla k závěru, že se řetězce s regulárním výrazem neshoduje, vrátí hodnotu označovanou jako `None`, tj. prázdnou hodnotu.
24+
25+
**Otázka:** Často je rodné číslo zapisováno ve formátu s podtržítkem, které odděluje datum narození od zbytku. Jak upravíme regulární výraz, aby akceptoval oba formáty, tj. formát s podtržítkem i bez podtržítka?
26+
27+
### Přísnější ověření formátu
28+
29+
Pokud chceš ověřit, jestli řetězec odpovídá zadanému výrazu a není tam nic navíc, můžeš použít funkci `fullmatch`, která funguje stejně jako funkce `match()`.
30+
31+
```py
32+
import re
33+
regularniVyraz = re.compile(r"\d{9,10}")
34+
35+
rezetec = "9511121234"
36+
print(regularniVyraz.match(rezetec))
37+
rezetec = "9511121234$ je moje rodné číslo"
38+
print(regularniVyraz.fullmatch(rezetec))
39+
```
40+
41+
### Zapojení podmínky
42+
43+
Pojďme nyní zapojit do akce podmínku. Můžeme třeba uživateli vypsat, jestli jím zadaná hodnota je správná. Výsledek volání funkce `match()` můžeme vložit přímo do podmínky, protože podmínka, které nevložíme operátor na porovnávání (např. `==`) funguje takto:
44+
45+
* Pokud podmínce vložíme nějaký smysluplný výraz, vyhodnotí ho jako **pravda**.
46+
* Pokud podmínce vložíme prázdnou hodnotu `None`, vyhodnotí ji jako **nepravda**.
47+
48+
```py
49+
import re
50+
51+
regularniVyraz = re.compile(r"\d{9,10}")
52+
vstup = input("Zadej rodné číslo: ")
53+
hledani = regularniVyraz.fullmatch(vstup)
54+
if hledani:
55+
print("Rodné číslo je v pořádku!")
56+
else:
57+
print("Nesprávné rodné číslo!")
58+
```
59+
60+
### E-maily
61+
62+
Pokud např. dostaneme e-mail `[email protected]`, víme, že je v pořádku. E-mail `info@czechitascz` by ale v pořádku nebyl, protože "koncovka" `"cz"` (v řeči počítačů doména prvního řádu) musí být oddělena tečkou.
63+
64+
```py
65+
import re
66+
67+
regularniVyraz = re.compile(r"\w+@\w+\.cz")
68+
email = input("Zadej e-mail: ")
69+
hledani = regularniVyraz.fullmatch(email)
70+
if hledani:
71+
print("E-mail je v pořádku!")
72+
else:
73+
print("Nesprávný e-mail!")
74+
```
75+
76+
### Vyhledávání
77+
78+
Kromě ověřování správného formátu můžeme použít regulární výrazy i k vyhledávání. Například funkce `findall` vrátí ze zadaného řetězce všechny podřetězce, které odpovídají danému regulárnímu výrazu, jako seznam.
79+
80+
Následující program například z deníku lékaře vyhledá rodná čísla všech pacientů, které lékař zmínil.
81+
82+
```py
83+
zapis = """
84+
Zápisy o provedených vyšetřeních:
85+
Pacient 6407156800 trpěl bolestí zad a byl poslán na vyšetření.
86+
Pacientka 8655057477 přišla na kontrolu po zranění kotníku.
87+
Do ordinace telefonovala pacientka 7752126712, které byl elektronicky vydán recept na Paralen.
88+
"""
89+
import re
90+
regularniVyraz = re.compile(r"\d{9,10}")
91+
vysledky = regularniVyraz.findall(zapis)
92+
for vysledek in vysledky:
93+
print(vysledek)
94+
```
95+
96+
Nyní máme zpracovat program, připraví informaci o pokutě pro majitele vozidla, který projel měřeným úsekem příliš rychle. V šabloně máme
97+
98+
```py
99+
zapis = """
100+
Vážený majiteli vozidla,
101+
náš rychlostní radar dne ${offenseDate} v ${offenseTime} hodin, který je umístěný na silnici ${road} ve směru jízdy ${direction},
102+
změřil, že motorové vozidlo registrační značky ${lp} překročilo maximální povolenou rychlost v daném místě a pohybovalo se rychlostí ${speed}. ¨
103+
Za tento přestupek Vás vyzýváme k zaplacení pokuty ${fine} Kč.
104+
Vyřizuje ${firstname} ${lastname}
105+
"""
106+
```
107+
108+
### Nahrazování
109+
110+
Uvažujme, že máme nějakém textu provést anonymizaci, tj. vymazat všechny osobní údaje. K tomu můžeme využít funkci `sub()`, která nahradí všechny podřetězce, které odpovídají regulárnímu výrazu, námi zadanou hodnotou.
111+
112+
```py
113+
zapis = """
114+
Zápisy o provedených vyšetřeních:
115+
Pacient 6407156800 trpěl bolestí zad a byl poslán na vyšetření.
116+
Pacientka 8655057477 přišla na kontrolu po zranění kotníku.
117+
Do ordinace telefonovala pacientka 7752126712, které byl elektronicky vydán recept na Paralen.
118+
"""
119+
import re
120+
regularniVyraz = re.compile(r"\d{9,10}")
121+
anonymniZapis = regularniVyraz.sub("X" * 9, zapis)
122+
print(anonymniZapis)
123+
```
124+
125+
## Cvičení: Regulární výrazy v Pythonu
126+
::exc[excs>uzivatelske-jmeno]
127+
::exc[excs>email-s-teckou]
128+
::exc[excs>zaznamy]
129+
::exc[excs>adresy-stranek]
130+
::exc[excs>ip-adresy]
131+
::exc[excs>prace-s-kodem]

ziskavani-dat/regularni-vyrazy/regularni-vyrazy.md

Lines changed: 0 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -179,136 +179,3 @@ Podívejme se nyní na pár příkladů. Níže máme tabulku s kurzy Czechitas.
179179
::exc[excs>napravy]
180180
::exc[excs>slavny-soude]
181181
::exc[excs>ave-caesar]
182-
183-
184-
## Regulární výrazy v Pythonu
185-
186-
V Pythonu máme řadu funkcí, které můžeme použít pro práci s regulárními výrazy. Projdeme si ty základní. Funkce jsou v modulu `re`, který je součástí Pythonu a můžeš ho importovat pomocí příkazu `import re` na začátku programu.
187-
188-
### Ověření formátu
189-
190-
Často potřebujeme ověřit, jestli máme zadaná data ve správném formátu. Např. telefonní čísla, rodná čísla, ISBN u knih, poštovní směrovací čísla, e-maily nebo čísla bankovního účtu mají jasně definovaný formát.
191-
192-
Zkusme si nejprve zadat rodné číslo. Víme, že rodné číslo se skládá ze 6 číslic, které kódují datum narození, a tří nebo čtyř číslic, které identifikují konkrétního člověka. Regulární výraz, který by číslo ověřil, je `\d{9,10}`.
193-
194-
Regulární výraz můžeme vytvořit pomocí funkce `compile()` z modulu `re`. Před řetězec s regulárními výrazy píšeme `r`, abychom Pythonu dali vědět, co je daný řetězec zač.
195-
196-
```py
197-
import re
198-
regularniVyraz = re.compile(r"\d{9,10}")
199-
200-
rezetec = "9511121234"
201-
print(regularniVyraz.match(rezetec))
202-
rezetec = "ahoj"
203-
print(regularniVyraz.match(rezetec))
204-
```
205-
206-
Pokud funkce `match` došla k závěru, že se řetězec shoduje s regulárním výrazem, vrátí objekt `Match`. S ním později budeme pracovat. Pokud by však funkce došla k závěru, že se řetězce s regulárním výrazem neshoduje, vrátí hodnotu označovanou jako `None`, tj. prázdnou hodnotu.
207-
208-
**Otázka:** Často je rodné číslo zapisováno ve formátu s podtržítkem, které odděluje datum narození od zbytku. Jak upravíme regulární výraz, aby akceptoval oba formáty, tj. formát s podtržítkem i bez podtržítka?
209-
210-
### Přísnější ověření formátu
211-
212-
Pokud chceš ověřit, jestli řetězec odpovídá zadanému výrazu a není tam nic navíc, můžeš použít funkci `fullmatch`, která funguje stejně jako funkce `match()`.
213-
214-
```py
215-
import re
216-
regularniVyraz = re.compile(r"\d{9,10}")
217-
218-
rezetec = "9511121234"
219-
print(regularniVyraz.match(rezetec))
220-
rezetec = "9511121234$ je moje rodné číslo"
221-
print(regularniVyraz.fullmatch(rezetec))
222-
```
223-
224-
### Zapojení podmínky
225-
226-
Pojďme nyní zapojit do akce podmínku. Můžeme třeba uživateli vypsat, jestli jím zadaná hodnota je správná. Výsledek volání funkce `match()` můžeme vložit přímo do podmínky, protože podmínka, které nevložíme operátor na porovnávání (např. `==`) funguje takto:
227-
228-
* Pokud podmínce vložíme nějaký smysluplný výraz, vyhodnotí ho jako **pravda**.
229-
* Pokud podmínce vložíme prázdnou hodnotu `None`, vyhodnotí ji jako **nepravda**.
230-
231-
```py
232-
import re
233-
234-
regularniVyraz = re.compile(r"\d{9,10}")
235-
vstup = input("Zadej rodné číslo: ")
236-
hledani = regularniVyraz.fullmatch(vstup)
237-
if hledani:
238-
print("Rodné číslo je v pořádku!")
239-
else:
240-
print("Nesprávné rodné číslo!")
241-
```
242-
243-
### E-maily
244-
245-
Pokud např. dostaneme e-mail `[email protected]`, víme, že je v pořádku. E-mail `info@czechitascz` by ale v pořádku nebyl, protože "koncovka" `"cz"` (v řeči počítačů doména prvního řádu) musí být oddělena tečkou.
246-
247-
```py
248-
import re
249-
250-
regularniVyraz = re.compile(r"\w+@\w+\.cz")
251-
email = input("Zadej e-mail: ")
252-
hledani = regularniVyraz.fullmatch(email)
253-
if hledani:
254-
print("E-mail je v pořádku!")
255-
else:
256-
print("Nesprávný e-mail!")
257-
```
258-
259-
### Vyhledávání
260-
261-
Kromě ověřování správného formátu můžeme použít regulární výrazy i k vyhledávání. Například funkce `findall` vrátí ze zadaného řetězce všechny podřetězce, které odpovídají danému regulárnímu výrazu, jako seznam.
262-
263-
Následující program například z deníku lékaře vyhledá rodná čísla všech pacientů, které lékař zmínil.
264-
265-
```py
266-
zapis = """
267-
Zápisy o provedených vyšetřeních:
268-
Pacient 6407156800 trpěl bolestí zad a byl poslán na vyšetření.
269-
Pacientka 8655057477 přišla na kontrolu po zranění kotníku.
270-
Do ordinace telefonovala pacientka 7752126712, které byl elektronicky vydán recept na Paralen.
271-
"""
272-
import re
273-
regularniVyraz = re.compile(r"\d{9,10}")
274-
vysledky = regularniVyraz.findall(zapis)
275-
for vysledek in vysledky:
276-
print(vysledek)
277-
```
278-
279-
Nyní máme zpracovat program, připraví informaci o pokutě pro majitele vozidla, který projel měřeným úsekem příliš rychle. V šabloně máme
280-
281-
```py
282-
zapis = """
283-
Vážený majiteli vozidla,
284-
náš rychlostní radar dne ${offenseDate} v ${offenseTime} hodin, který je umístěný na silnici ${road} ve směru jízdy ${direction},
285-
změřil, že motorové vozidlo registrační značky ${lp} překročilo maximální povolenou rychlost v daném místě a pohybovalo se rychlostí ${speed}. ¨
286-
Za tento přestupek Vás vyzýváme k zaplacení pokuty ${fine} Kč.
287-
Vyřizuje ${firstname} ${lastname}
288-
"""
289-
```
290-
291-
### Nahrazování
292-
293-
Uvažujme, že máme nějakém textu provést anonymizaci, tj. vymazat všechny osobní údaje. K tomu můžeme využít funkci `sub()`, která nahradí všechny podřetězce, které odpovídají regulárnímu výrazu, námi zadanou hodnotou.
294-
295-
```py
296-
zapis = """
297-
Zápisy o provedených vyšetřeních:
298-
Pacient 6407156800 trpěl bolestí zad a byl poslán na vyšetření.
299-
Pacientka 8655057477 přišla na kontrolu po zranění kotníku.
300-
Do ordinace telefonovala pacientka 7752126712, které byl elektronicky vydán recept na Paralen.
301-
"""
302-
import re
303-
regularniVyraz = re.compile(r"\d{9,10}")
304-
anonymniZapis = regularniVyraz.sub("X" * 9, zapis)
305-
print(anonymniZapis)
306-
```
307-
308-
## Cvičení: Regulární výrazy v Pythonu
309-
::exc[excs>uzivatelske-jmeno]
310-
::exc[excs>email-s-teckou]
311-
::exc[excs>zaznamy]
312-
::exc[excs>adresy-stranek]
313-
::exc[excs>ip-adresy]
314-
::exc[excs>prace-s-kodem]

0 commit comments

Comments
 (0)