You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
Copy file name to clipboardExpand all lines: ziskavani-dat/regularni-vyrazy/regularni-vyrazy.md
-133Lines changed: 0 additions & 133 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -179,136 +179,3 @@ Podívejme se nyní na pár příkladů. Níže máme tabulku s kurzy Czechitas.
179
179
::exc[excs>napravy]
180
180
::exc[excs>slavny-soude]
181
181
::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.
0 commit comments