Programiranje 1
Regularni izrazina programskom jeziku Python
Univerzitet u Beogradu
Elektrotehnički fakultet
2019/2020.
Uvod (1)
Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski
⚫ Zapisi (logovi) koje proizvode različite aplikacije
⚫ Korisnički tekstovi
⚫ Obrada prirodnih jezika
Postoji veliki broj situacija kada je potrebno:
⚫ Prepoznati određene šablone u tekstu
⚫ Izdvojiti strukturirane podatke iz teksta
⚫ Validirati da string zadovoljava određena pravila
2/21ETF Beograd::Programiranje 1
Uvod – primeri (2)
Prepoznati da li rečenica počinje sa The, a završava se sa end.⚫ The end is near.⚫ The game came to an end.
Izdvojiti iz stringa sve datume u formatu YYYY-MM-DD:⚫ The exam will take place on 2020-01-10,
while the next semester starts on 2020-02-19.⚫ Šta ukoliko je potrebno datume promeniti u D-M-YYYY?
Validirati da li je korisnik zadao valjanu e-mail adresu⚫ [email protected]⚫ 123pera@[email protected]
3/21ETF Beograd::Programiranje 1
Uvod – primeri (3)
Prebrojavanje znakova interpunikcije u tekstudef punct_count1(line):
punct = ['.', ',', ';', ':', '!', '?']
num_punct = 0
for p in punct:
if p in line:
num_punct += line.count(p)
return num_punct
def punct_count2(line):
punct = ['.', ',', ';', ':', '!', '?']
return len([l for l in line if l in punct])
4/21ETF Beograd::Programiranje 1
Uvod – primeri (4)
Izvršavanje:>>> line = """To be, or not to be, that is the question:
Whether tis nobler in the mind to suffer
The slings and arrows of outrageous fortune,
Or to take arms against a sea of troubles,
And by opposing end them."""
>>> punct_count1(line)
6
>>> punct_count2(line)
6
Da li ovakva obrada teksta može da se reši drugačije?
5/21ETF Beograd::Programiranje 1
Koncept regularnih izraza
Regularni izrazi predstavljaju način da se specificiraju šabloni koje treba pronaći unutar teksta⚫ Regular expression (regex)⚫ Predstavljaju sekvencu karaktera
koja može sadržati specijalne, metakaraktere⚫ Metakarakteri se koriste da se opišu složeni šabloni⚫ Vrsta sintaksnih notacija ☺
Koriste se za više namena:⚫ Pronalaženje u zadatom stringu svih onih podstringova
koji svojom strukturom zadovoljavaju zadati obrazac⚫ Zamenu podstringova drugim (napredni Find & Replace)⚫ Definišu šablone po kojima će se kreirati stringovi
6/21ETF Beograd::Programiranje 1
Definisanje regularnih izraza (1)
Regularni izrazi su na Python-u podržani kroz modul re
Sintaksa za kreiranje regularnih izraza je inspirisana sintaksom iz jezika Perl⚫ Postoje i drugi standardi: ECMAScript, bash, PHP
Zadavanje regularnih izraza se vrši kroz string:⚫ Korišćenjem običnih stringova
Problem sa tzv. escape sekvencama kao što su \n Obrnuta kosa crta (backslash) \ često ima specijalno značenje
u okviru regularnog izraza
⚫ Korišćenjem sirovih (raw) stringova (češće) Koristi se prefiks r ispred literala stringa: r'' ili r""
Svi karakteri se tumače doslovno kao što su zadati
7/21ETF Beograd::Programiranje 1
Definisanje regularnih izraza (2)
Unutar šablona znakovi predstavljaju sami sebe⚫ Osim specijalnih znakova koji omogućavaju
definisanje dodatnih pravila za uparivanje šablona
Važniji specijalni karakteri (operatori) su:⚫ . – odgovara bilo kom karakteru osim \n
⚫ * – omogućava ponavljanje znaka koji mu prethodi od 0 do beskonačno
⚫ + – omogućava ponavljanje znaka koji mu prethodi od 1 do beskonačno
⚫ ? – omogućava ponavljanje znaka koji mu prethodi nijednom ili jednom
8/21ETF Beograd::Programiranje 1
Definisanje regularnih izraza (3)
Definisanje ponavljanja u tačno određenom opsegu:⚫ {n}, {m,n} – pojavljivanje nekog znaka
tačno određen broj puta ili iz određenog intervala
Definisanje grupa u okviru šablona:⚫ () – zagrade, za grupisanje izraza i definisanje sekvenci
koje će biti vraćene Sve pre ovoga vraćalo je ceo izraz
⚫ Grupe su nemerisane od 1 do 99
Specijalno ponašanje grupa sa znakom ? na početku⚫ (?:) – zagrade u kojima su prva dva znaka ?:
služe samo za grupisanje, a ne i za vraćanje⚫ (?i) – ignoriše razliku između malih i velikih slova⚫ (?P<name>) – imenovanje grupe imenom name
9/21ETF Beograd::Programiranje 1
Definisanje regularnih izraza (4)
Operator izbora:⚫ | – omogućava izbor između dve grupe šablona
za uparivanje
⚫ Često se koristi sa operatorom za grupisanje
Pojavljivanje šablona na tačno određenom mestu:⚫ ^ – uparuje se šablon samo na početku stringa
⚫ $ – uparuje se šablon samo na kraju stringa
10/21ETF Beograd::Programiranje 1
Definisanje regularnih izraza (5)
Postoje ugrađeni metakarakteri koji opisuju neke klase karaktera ili osobine uparivanja⚫ Zadaju tzv. escape sekvencom koja počinje sa \
Primeri:⚫ \d – cifra⚫ \D – ne-cifra⚫ \s – beli znaci (razmak, novi red, tabulacija)⚫ \S – ne-beli znaci⚫ \w – alfanumerici i donja crta⚫ \. – sama tačka (ne znači bilo koji znak)⚫ \? – sam upitnik (ne definiše opcionu pojavu)⚫ \w – uparuje reč⚫ \b – uparuje granice reči (word boundary)
11/21ETF Beograd::Programiranje 1
Skupovi karaktera
Moguće je definisati skup karaktera koji se očekuje na nekom mestu korišćenjem operatora []⚫ Pojedinačni karakteri koji se direktno navedu⚫ Opseg karaktera definisan početkom, crticom i krajem
Primeri:⚫ [a-z] – sva mala slova⚫ [A-Z] – sva velika slova⚫ [A-Za-z] – velika i mala slova⚫ [abc] – slova a, b, c ⚫ [^a-m] – karakteri koji nisu a-m ⚫ [\[\]] – karakteri [ ili ]
12/21ETF Beograd::Programiranje 1
Primeri šablona
Realan broj:⚫ Oblika: +/- ceo_deo.decimalni_deo
⚫ [\+\-]?\d\+(?:\.\d+)?
Adresa elektronske pošte:⚫ [a-z][a-z0-9\.]*@[a-z]+(?:\.[a-z])*\.(?:com|org|[a-z]{2}) ???
⚫ ^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$
Studentska adresa elektronske pošte:⚫ Inicijali prezimena i imena⚫ Dve cifre godine upisa i četiri cifre registracionog broja⚫ Sufiks d, m ili p u zavisnosti od nivoa studija⚫ [a-z]{2}\d{6}[dmp]@student\.etf\.rs
13/21ETF Beograd::Programiranje 1
Uparivanje šablona
re.match(pattern, string)
⚫ Vraća MatchObject ako se javlja sekvenca karakterasamo na početku stringakoja odgovara navedenom regularnom izrazu
⚫ MatchObject.group(int|string) –nađena grupa, po rednom broju ili imenu grupe 0 – ceo izraz; 1 – prva grupa, itd.
⚫ MatchObject.start(group) –polazni indeks izraza, odnosno predate grupe
⚫ MatchObject.end(group) – krajnji indeks
⚫ MatchObject.span(group) – opseg
14/21ETF Beograd::Programiranje 1
Primer uparivanja
Neka string sadrži telefonski broj:>>> telefon = "0113218202"
Provera pozivnog broja:>>> mo1 = re.match('011', telefon)
>>> mo1
<re.Match object; span=(0, 3), match='011'>
Izdvajanje pozivnog broja i ostatka broja korišćenjem grupa:>>> mo2 = re.match('(011)([0-9]*)', telefon)
>>> mo2.group(1)
'011'
>>> mo2.group(2)
'3218202'
15/21ETF Beograd::Programiranje 1
Ostale funkcije za rad sa regularnim izrazima (1)
re.search(pattern, string)
⚫ Pronalazi lokaciju gde se javi match, bilo gde u stringu
re.findall(pattern, string)
⚫ Vraća listu pronađenih sekvenci
⚫ Element liste: torka, čiji svaki element odgovara jednoj grupi
re.finditer(pattern, string)
⚫ Vraća iterator koji daje match objekte
⚫ Može se koristiti u for petlji:for s in
re.finditer(r'<p>(\d+\.\d+,\d+)</p>', text):
s.group(0) # vraća ceo izraz
16/21ETF Beograd::Programiranje 1
Ostale funkcije za rad sa regularnim izrazima (2)
Primer upotrebe findall()
String: "abrakadabra 35.48 abrakadabra 55.66"
Šablon: \d+\.\d+
⚫ Vraća [‘35.48', '55.66’]
Šablon: (\d+)\.(\d+)
⚫ Vraća [(‘35', ‘48'), ('55', '66')]
Šta vraća za (\d)+\.(\d)+?
Dodatni primer: regex_phone_number.py
17/21ETF Beograd::Programiranje 1
Ostale funkcije za rad sa regularnim izrazima (3)
Primer upotrebe finditer()
String: zurka = "Mika Geek 011/2134567, Pera Kosac011-9876543, Metalac Ika 064222-333, zovi iCicu 322-444 super Iva 064888999"
Poziv funkcije koji izdvaje sve telefone iz stringa:>>> for s in re.finditer( \r'([0-9]{3}[/-]?)(\d+)-?(\d+)', zurka ):
print (s.group(0))
011/2134567
011-9876543
064222-333
322-444
064888999
18/21ETF Beograd::Programiranje 1
Ostale funkcije za rad sa regularnim izrazima (4)
Postoji mogućnost vršenja zamena nakon uparivanja sadržaja šablonom:re.sub(pattern, repl, string)
⚫ repl može biti string ili funkcija koja vraća string
⚫ repl može sadržati povratne reference na grupe korišćenjem \ i broja grupe (backreferencing) Npr. \1
Primer:telefon2 = re.sub('011', '064', telefon)
>>> telefon2
'0643218202'
19/21ETF Beograd::Programiranje 1
Literatura - knjige
M. Kovačević, Osnove programiranja u Pajtonu, Akademska misao, Beograd, 2017.
M. Lutz, Learning python: Powerful object-oriented programming, 5th edition, O'Reilly Media, Inc., 2013.
J. Zelle, Python Programming: An Introduction to Computer Science, 3rd Ed., Franklin, Beedle & Associates, 2016.
D. Beazley, B. K. Jones, Python Cookbook, 3rd edition, O'Reilly Media, 2013.
A. Downey, J. Elkner, C. Meyers, How To Think Like A Computer Scientist: Learning With Python, free e-book
20/21ETF Beograd::Programiranje 1
Literatura – online izvori
Python 3.8.0 documentation, https://docs.python.org/3/index.html
Colin Morris, 7-day Python course, https://www.kaggle.com/learn/python
Learn Python, Basic tutorial, https://www.learnpython.org/
TutorialsPoint, Python tutorial https://www.tutorialspoint.com/python/index.htm
21/21ETF Beograd::Programiranje 1