Ponavljanje: tipovi podataka i funkcije Funkcija za provjeru regex-a REGEX Funkcije search() i match() Kvantifikatori Klase/razredi uzoraka Uvod u skupine (grupe) uzoraka Domaća zadaća Rad s regularnim izrazima Vježba 2 Regularni izrazi I (eng. regex) 2.1 Ponavljanje: tipovi podataka i funkcije 2.1.1 Funkcija za provjeru regex-a Neka je zadan Python program koji se sastoji od funkcije test_re() koja služi za provjeru regularnih izraza i njihov pregledan ispis, te programskog odsječka u nastavku programa, koji poziva tu funkciju i provjerava djelovanje skraćenih kodova kao probnih uzoraka regularnog izraza. Program 2.1 test regex. 1 ## Uvod u REGULARNE IZRAZE 2 3 import re 4 5 ## FUNKCIJA ZA TESTIRANJE 6 def test_re(txt,uzorci=[]): 7 u"""program za provjeru regularnih izraza 8 niz regularnih izraza pi²e se u listi, 9 a dopu²ten je i komentar 10 """ 11 for uzorak,opis in uzorci: 12 print("\n") 13 print('=> Uzorak %s (%s)' % (uzorak,opis)) 14 print(' %r' % txt) 15 for nasli in re.finditer(uzorak, txt): 16 s=nasli.start() 17 e=nasli.end() 18 nasli = txt[s:e] 19 n_kosih = txt[:s].count('\\') 20 prefix = '.' * (s + n_kosih) 21 print(' %s%r' % (prefix,nasli)) 22 return 23 24 ## SKRA ENI KODOVI 25 print('** SKRA ENI KODOVI **') 26 test_re(
14 Regularni izrazi I (eng. regex) 27 'Ovo je #1 primjer!', 28 [ (r'\d+', 'niz znamenki'), 29 (r'\d+', 'niz ne-znamenki'), 30 (r'\s+', 'niz praznina'), 31 (r'\s+', 'niz ne-praznina'), 32 (r'\w+', 'alfanumeri ki znakovi'), 33 (r'\w+', 'ne-alfanumeri ki znakovi'), 34 ]) Pokretanjem programa dobije se sljedeći ispis na zaslonu: Zaslon 2.1 ** SKRA ENI RE-KODOVI ** => Uzorak \d+ (niz znamenki) 'Ovo je #1 primjer!'...'1' => Uzorak \D+ (niz ne-znamenki) 'Ovo je #1 primjer!' 'Ovo je #'...' primjer!' => Uzorak \s+ (niz praznina) 'Ovo je #1 primjer!'...' '...' '...' ' => Uzorak \S+ (niz ne-praznina) 'Ovo je #1 primjer!' 'Ovo'...'je'...'#1'...'primjer!' => Uzorak \w+ (alfanumeri ki znakovi) 'Ovo je #1 primjer!' 'Ovo'...'je'...'1'...'primjer' => Uzorak \W+ (ne-alfanumeri ki znakovi)
2.2 REGEX 15 'Ovo je #1 primjer!'...' '...' #'...' '...'!' >>> Obrazložite svaki pojedinačni ispis. Potom odgovorite na sljedeća pitanja: 1. Koje učitavanje Python modula je bolje: import re ili from re import *? 2. Kako se u funkciju test_re() prenose uzorci regularnog izraza? 3. Kako se stvara help funkcija bilo koje Python funkcije? 4. Koji tip podatka vraća finditer()? 5. Koja je razlika izme du %s i %r formata? Probajte ispitati funkciju test_re() s nekim drugim tekstom i s nekim drugim uzorcima! 2.2 REGEX 2.2.1 Funkcije search() i match() Zadatak 2.1 Funkcija search() traži regularne uzorke u zadanom tekstu. Uzorak može biti i najobičniji string, zašto ne? Program 2.2 search(). Prije pokretanja programa pozorno proučite svaki njegov redak: 1 print('** SEARCH() **') 2 uzorak = 'ovaj' 3 tekst = 'Ima li ovaj tekst ovaj uzorak?' 4 nasli = re.search( X ) 5 s = nasli.start() 6 e = nasli.end() 7 print('nasli "%s" u "%s" \n od %d. do %d. mjesta - smje²ten je ("%s")' % \ 8 (nasli.re.pattern, nasli. Y, s, e, tekst Z )) koji daje sljedeći ispis na zaslonu: Zaslon 2.2 ** SEARCH() ** Nasli "ovaj" u "Ima li ovaj tekst ovaj uzorak?" od 7. do 11. mjesta - smje²ten je ("ovaj")
16 Regularni izrazi I (eng. regex) Kojeg tipa je varijabla nasli, te koje sve atribute i funkcije(metode) ona ima? Upišite ispravne nizove znakova umjesto zamjenskih X, Y, Z kako bi program ispravno radio. Zadatak 2.2 Funkcija search() traži regularne uzorke u zadanom tekstu. Uzorak može biti i najobičniji string, zašto ne? Program 2.3 compile(). Prije pokretanja programa pozorno proučite svaki njegov redak: 1-2 print('** COMPILE() **') 3 # Precompilacija uzoraka 4 regexi = [ re.compile(p) 5 for p in [ 'taj', 'ovo', 'Ima', 'onaj', 'uzorak'] 6 ] 7 tekst = 'Ima li ovaj tekst taj uzorak?' 8 print('tekst: %r\n' % tekst) 9 10 print('* MATCH *') 11 for regex in regexi: 12 print('traºim "%s" ->' % regex.pattern), 13 if regex.match(tekst): 14 print('ima ga MATCH :)!') 15 else: 16 print('nema ga MATCH :(') 17 print 18 print('*search *') 19 for regex in regexi: 20 print('traºim "%s" ->' % regex.pattern), 21 if regex.search(tekst): 22 print('ima ga SEARCH :)!') 23 else: 24 print('nema ga SEARCH :(') Za metodu compile() možete pogledati argumente na koncu dokumenta. Nakon izvo denja program daje sljedeći ispis na zaslonu: Zaslon 2.3 ** COMPILE() ** tekst: 'Ima li ovaj tekst taj uzorak?' * MATCH * Traºim "taj" -> Nema ga MATCH :( Traºim "ovo" -> Nema ga MATCH :( Traºim "Ima" -> Ima ga MATCH :)! Traºim "onaj" -> Nema ga MATCH :( Traºim "uzorak" -> Nema ga MATCH :( *SEARCH * Traºim "taj" -> Ima ga SEARCH :)! Traºim "ovo" -> Nema ga SEARCH :( Traºim "Ima" -> Ima ga SEARCH :)! Traºim "onaj" -> Nema ga SEARCH :( Traºim "uzorak" -> Ima ga SEARCH :)!
2.2 REGEX 17 Kojeg tipa je varijabla regexi, a kojeg njezini elementi? Koje prednosti ima compiliranje uzoraka pred klasičnim (stringovnim) pozivima? Zašto funkcija match() ne pronalazi iste compilirane uzorke u tekstu, kao što uspijeva search()? 2.2.2 Kvantifikatori Zadatak 2.3 Upoznajmo kvantifikatore regularnih izraza: Program 2.4 kvantifikatori. 1 print('** RE-KVANTIFIKATORI **') 2 test_re( 3, 4 [ ('ab*', 'iza a slijede 0 ili vi²e b'), 5 ('ab+', 'iza a slijede 1 ili vi²e b'), 6 ('ab?', 'iza a slijedi nijedan ili 1 b'), 7 ('ab{3}', 'iza a slijede 3 b'), 8 ('ab{2,3}', 'iza a slijede 2 ili 3 b'), 10 11 9 ]) 12 ## ne pohlepni kvantifikatori 13 print('** NE POHLEPNI RE-KVANTIFIKATORI **') 14 test_re( 15, 16 [ ('ab*?', 'iza a slijede 0 ili vi²e b'), 17 ('ab+?', 'iza a slijede 1 ili vi²e b'), 18 ('ab??', 'iza a slijedi nijedan ili 1 b'), 19 ('ab{3}?', 'iza a slijede 3 b'), 20 ('ab{2,3}?', 'iza a slijede 2 ili 3 b'), 21 ]) daje sljedeći ispis na zaslonu: Zaslon 2.4... ** RE-KVANTIFIKATORI ** => Uzorak ab* (iza a slijede 0 ili vi²e b) 'abb'...'a'...'abbb'...'a' => Uzorak ab+ (iza a slijede 1 ili vi²e b) 'abb'...'abbb' => Uzorak ab? (iza a slijedi nijedan ili 1 b)
18 Regularni izrazi I (eng. regex) 'ab'...'a'...'ab'...'a' => Uzorak ab{3} (iza a slijede 3 b)...'abbb' => Uzorak ab{2,3} (iza a slijede 2 ili 3 b) 'abb'...'abbb'!!! PRIJE IZVOÐENJA PROGRAMA PRETPOSTAVITE RJE ENJA!!! ** NE POHLEPNI RE-KVANTIFIKATORI ** => Uzorak (upi²ite:...) (iza a slijede 0 ili vi²e b) 'a'...'a'...'a'...'a' => Uzorak (upi²ite:...) (iza a slijede 1 ili vi²e b) 'ab'...'ab' => Uzorak (upi²ite:...) (iza a slijedi nijedan ili 1 b) 'a'...'a'...'a'...'a' => Uzorak (upi²ite:...) (iza a slijede 3 b)...'abbb'
2.2 REGEX 19 => Uzorak (upi²ite:...) (iza a slijede 2 ili 3 b) 'abb'...'abb' ** RE-KLASE ** => Uzorak (upi²ite:...) (ili a ili b) 'a'.'b'..'b'...'a'...'a'...'b'...'b'...'b'...'a' => Uzorak (upi²ite:...) (iza a slijedi 1 ili vi²e a ili b) => Uzorak (upi²ite:...) (iza a slijedi 1 ili vi²e a ili b, ne pohlepno) 'ab'...'aa' 2.2.3 Klase/razredi uzoraka Zadatak 2.4 Cilj je upoznati klase znakova, njihova izuzeća i opsege (raspone) djelovanja. Program 2.5 klase uzoraka. 1 ## re-klase 2 print('** RE-KLASE **') 3 test_re( 4, 5 [ ('[ab]', 'ili a ili b'), 6 ('a[ab]+', 'iza a slijedi 1 ili vi²e a ili b'), 7 ('a[ab]+?', 'iza a slijedi 1 ili vi²e a ili b, ne pohlepno'), 8 ]) 9 10 ## klase s izuze em 11 print('** RE-KLASE S IZUZECEM **') 12 test_re( 13, 14 [ ('[^-. ]+', 'niz bez -,., i praznine (razmaknice)'), 15 ])
20 Regularni izrazi I (eng. regex) 16 17 18 ## klase s rasponima 19 print('** RE-KLASE S RASPONIMA **') 20 test_re( 21, 22 [ ('[a-z]+', 'niz s malim slovima'), 23 ('[A-Z]+', 'niz s velikim slovima'), 24 ('[a-za-z]+', 'niz s malim i velikim slovima'), 25 ('[A-Z][a-z]+', 'jedno veliko slovo iza kojeg slijede mala'), 26 ]) daje sljedeći ispis na zaslonu: Zaslon 2.5 ** RE-KLASE ** => Uzorak [ab] (ili a ili b) 'a'.'b'..'b'...'a'...'a'...'b'...'b'...'b'...'a' => Uzorak a[ab]+ (iza a slijedi 1 ili vi²e a ili b) => Uzorak a[ab]+? (iza a slijedi 1 ili vi²e a ili b, ne pohlepno) 'ab'...'aa' ** RE-KLASE S IZUZEÄ EM ** => Uzorak [^-. ]+ (niz bez -,., i praznine (razmaknice)) 'Ovo'...'je'...'neki'...'tekst'...'s'...'interpunkcijskim'
2.2 REGEX 21...'znacima' ** RE-KLASE S RASPONIMA ** => Uzorak [a-z]+ (niz s malim slovima).'vo'...'je'...'neki'...'tekst'...'s'...'interpunkcijskim'...'znacima' => Uzorak [A-Z]+ (niz s velikim slovima) 'O' => Uzorak [a-za-z]+ (niz s malim i velikim slovima) 'Ovo'...'je'...'neki'...'tekst'...'s'...'interpunkcijskim'...'znacima' => Uzorak [A-Z][a-z]+ (jedno veliko slovo iza kojeg slijede mala) 'Ovo' Zadatak 2.5 Cilj je pokazati posebnost meta-znaka točke (. ). Program 2.6 meta znakovi. 1 2 print('** TOƒKA - BILO ²TO **') 3 test_re( 4, 5 [ ('a.', 'iza a slijedi bilo koji znak'), 6 ('b.', 'iza b slijedi bilo koji znak'), 7 ('a.*b', 'iza a slijedi s bilo im i zavr²ava s b'), 8 ('a.*?b', 'iza a slijedi s bilo im i zavr²ava s b'), 9 ]) daje sljedeći ispis na zaslonu:
22 Regularni izrazi I (eng. regex) Zaslon 2.6 ** TOƒKA - BILO TO ** => Uzorak a. (iza a slijedi bilo koji znak) 'ab'...'aa' => Uzorak b. (iza b slijedi bilo koji znak).'bb'...'bb'...'ba' => Uzorak a.*b (iza a slijedi s bilo im i zavr²ava s b) 'abbaabbb' => Uzorak a.*?b (iza a slijedi s bilo im i ² s b) 'ab'...'aab' Zadatak 2.6 Cilj je pokazati posebne meta-znakove koji znače navigacijske točke (sidrišta) Program 2.7 sidrišta. 1 print('** SIDRENJA **') 2 test_re( 3, 4 [ (r'^\w+', 'rije na po etku niza'), 5 (r'\a\w+', 'rije na po etku niza'), 6 (r'\w+\s*$', 'rije blizu zavr²etka niza, preska e interpunkciju'), 7 (r'\w+\s*\z', 'rije blizu zavr²etka niza, preska e interpunkciju'), 8 (r'\w*t\w*', 'rije koja sadrºi t'), 9 (r'\bt\w+', 't na po tku rije i'), 10 (r'\w+t\b', 't na zavr²etku rije i'), 11 (r'\bt\b', 't koja nije ni na po etku ni na zavr²etku rije i'), 12 ]) koji daje sljedeći ispis na zaslonu: Zaslon 2.7 ** SIDRENJA ** => Uzorak ^\w+ (rije na po etku niza)
2.2 REGEX 23 'Ovo' => Uzorak \A\w+ (rije na po etku niza) 'Ovo' => Uzorak \w+\s*$ (rije blizu zavr²etka niza, preska e interpunkciju)...'znacima.' => Uzorak \w+\s*\z (rije blizu zavr²etka niza, preskaä e interpunkciju)...'znacima.' => Uzorak \w*t\w* (rije koja sadrºi t)...'tekst'...'interpunkcijskim' => Uzorak \bt\w+ (t na po etku rije i)...'tekst' => Uzorak \w+t\b (t na zavr²etku rije i)...'tekst' => Uzorak \Bt\B (t koja nije ni na po etku ni na zavr²etku rije i)...'t' 2.2.4 Uvod u skupine (grupe) uzoraka Zadatak 2.7 Program 2.8 skupine. Ovaj program uvodi skupine ili grupe meta-znakova regularnog uzorka 1 print('** SKUPINE (GRUPE) **') 2 test_re( 3 'abbaaabbbbaaaaa', 4 [ ('a(ab)', 'iza a slijedi literal ab'), 5 ('a(a*b*)', 'iza a slijedi 0-n a-ova i 0-n b-ovo'), 6 ('a(ab)*', 'iza a slijedi 0-n ab-ova'),
24 Regularni izrazi I (eng. regex) 7 ('a(ab)+', 'iza a slijedi 1-n ab'), 8 ]) što pokretanjem daje sljedeći ispis na zaslonu: Zaslon 2.8 ** SKUPINE (GRUPE) ** => Uzorak a(ab) (iza a slijedi literal ab) 'abbaaabbbbaaaaa'...'aab' => Uzorak a(a*b*) (iza a slijedi 0-n a-ova i 0-n b-ovo) 'abbaaabbbbaaaaa' 'abb'...'aaabbbb'...'aaaaa' => Uzorak a(ab)* (iza a slijedi 0-n ab-ova) 'abbaaabbbbaaaaa' 'a'...'a'...'aab'...'a'...'a'...'a'...'a'...'a' => Uzorak a(ab)+ (iza a slijedi 1-n ab) 'abbaaabbbbaaaaa'...'aab' 2.3 Domaća zadaća 2.3.1 Rad s regularnim izrazima Domaća zadaća 2.1 Nadopunite listu uzorci s uzorcima regularnih izraza: 1 import re 2 print(tekst) 3 4 uzorci = [ 5 (r'...', 'rije na po etku niza'), 6 (r'...', 'rije na zavr²etku niza, s dodatnim interpunkcijama'),
2.3 Domaća zadaća 25 7 (r'...', 'rije koja po inje s t, pa idu a rije '), 8 (r'...', 'rije koja zavr²ava sa slovom m'), 9 ] 10 11 for uzorak, desc in uzorci: 12 regex = re.compile(uzorak) 13 nasli = regex.search(tekst) 14 print('%s\n' % desc), 15 print(nasli.groups()) 16 17 % koji će dati sljedeći zaslon: Zaslon 2.9 ** REGEX SKUPINE (GRUPE) ** Ovo je neki udni tekst *$! sa ---!?*$.%- interpunkcijskim znakovima. (rije na po etku niza) ('Ovo',) (rije na zavr²etku niza, s dodatnim interpunkcijama) ('znakovima',) (rije koja po inje s t, pa idu a rije ) ('tekst', 'sa') (rije koja zavr²ava sa slovom m) ('interpunkcijskim',)
26 Regularni izrazi I (eng. regex)