Vous êtes sur la page 1sur 25

Programiranje 1

Regularni izrazi
na programskom jeziku Python
Univerzitet u Beogradu
Elektrotehnički fakultet
2020/2021.
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

ETF Beograd::Programiranje 1 2/25


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
⚫ pera.peric@student.etf.bg.ac.rs
⚫ 123pera@student@etf.bg.ac.rs

ETF Beograd::Programiranje 1 3/25


Uvod – primeri (3)
 Prebrojavanje znakova interpunikcije u tekstu
def 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])

ETF Beograd::Programiranje 1 4/25


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?
ETF Beograd::Programiranje 1 5/25
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

ETF Beograd::Programiranje 1 6/25


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

ETF Beograd::Programiranje 1 7/25


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

ETF Beograd::Programiranje 1 8/25


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

ETF Beograd::Programiranje 1 9/25


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

ETF Beograd::Programiranje 1 10/25


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)

ETF Beograd::Programiranje 1 11/25


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 ]

ETF Beograd::Programiranje 1 12/25


Primeri šablona (1)
 Realan broj oblika: +/- ceo_deo.decimalni_deo
 Šablon: [+-]?\d+(?:\.\d+)?
 Prvi deo šablona služi za uparivanje opcione pojave znaka [+-]?
⚫ Zadaje se skup dozvoljenih znakova pomoću zagrada []
⚫ Skup čine znakovi + i –
⚫ Znak ? nakon srednjih zagrada specificira
opciono pojavljivanje znaka broja
 Sledeći deo šablona \d+ uparuje cifre celog dela broja
⚫ Koristi se metakarakter \d za uparivanje cifara
⚫ Koristi se operator + da označi ponavljanje od najmanje jedne cifre
 Grupa (?:\.\d+)? se koristi da opiše decimalni deo
⚫ Znak ? nakon zagrada specificira opciono pojavljivanje
decimalnog dela broja
⚫ Decimalni deo se definiše znakom tačka \.
nakon koga sledi ponavljanje od najmanje jedne cifre sa \d+

ETF Beograd::Programiranje 1 13/25


Primeri šablona (2)
 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
 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})+$
⚫ Da li su identične?
ETF Beograd::Programiranje 1 14/25
Kreiranje šablona
 Šablon se može zadavati funkcijama
u obliku (sirovog) stringa
⚫ r[+-]?\d+(?:\.\d+)?"
 Može se napraviti objekat šablona:
⚫ sablon = re.compile(regularni_izraz)
⚫ realan_broj = \
re.compile("[+-]?\d+(?:\.\d+)?")
⚫ Funkcije za uparivanje i
pretragu se onda mogu pozivati za taj objekat šablona

ETF Beograd::Programiranje 1 15/25


Uparivanje šablona
 re.match(pattern, string)
⚫ Vraća MatchObject ako se javlja sekvenca karaktera
samo na početku stringa
koja 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

ETF Beograd::Programiranje 1 16/25


Primer uparivanja (1)
 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'

ETF Beograd::Programiranje 1 17/25


Primer uparivanja (2)
 Može da se napravi objekat šablona
koji odgovara realnom broju:
>>> rb = re.compile("[+-]?\d+(?:\.\d+)?")
 Provera realnog broja:
>>> rb.match(broj)
<re.Match object; span=(0, 5), match='+3.14'>
>>> rb.match("-31.14343")
<re.Match object; span=(0, 9), match='-31.14343'>
>>> rb.match("31.14343")
<re.Match object; span=(0, 8), match='31.14343'>
>>> rb.match("+31.14343")
<re.Match object; span=(0, 9), match='+31.14343'>
>>> rb.match("+31")
<re.Match object; span=(0, 3), match='+31'>
>>> rb.match(".3") # Vraća None – nije dozvoljen oblik

ETF Beograd::Programiranje 1 18/25


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

ETF Beograd::Programiranje 1 19/25


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
ETF Beograd::Programiranje 1 20/25
Ostale funkcije za rad
sa regularnim izrazima (3)
 Prebrojavanje znakova interpunikcije u tekstu:
import re
def punct_count3(line):
punct = r"[.,;:!?]"
return len(re.findall(punct, line))
>>> 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_count3(line)
6

ETF Beograd::Programiranje 1 21/25


Ostale funkcije za rad
sa regularnim izrazima (4)
 Primer upotrebe finditer()
 String:
zurka = "Mika Geek 011/2534567, Pera Kosac
011-9876543, Metalac Ika 064222-333, zovi i
Cicu 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/2534567
011-9876543
064222-333
322-444
064888999
ETF Beograd::Programiranje 1 22/25
Ostale funkcije za rad
sa regularnim izrazima (5)
 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'
ETF Beograd::Programiranje 1 23/25
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

ETF Beograd::Programiranje 1 24/25


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.ht
m

ETF Beograd::Programiranje 1 25/25

Vous aimerez peut-être aussi