programiranje 1 uvod u programski jezik python · uvod (1) obrada teksta je veoma česta aktivnost...
TRANSCRIPT
Programiranje 1
Regularni izrazina 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
2/25ETF 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/25ETF 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/25ETF 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/25ETF 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/25ETF 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/25ETF 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/25ETF 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/25ETF 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/25ETF 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/25ETF 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/25ETF Beograd::Programiranje 1
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+
13/25ETF Beograd::Programiranje 1
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?
14/25ETF Beograd::Programiranje 1
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
15/25ETF Beograd::Programiranje 1
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
16/25ETF Beograd::Programiranje 1
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'
17/25ETF Beograd::Programiranje 1
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
18/25ETF 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
19/25ETF 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
20/25ETF Beograd::Programiranje 1
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
21/25ETF Beograd::Programiranje 1
Ostale funkcije za rad sa regularnim izrazima (4)
Primer upotrebe finditer()
String: zurka = "Mika Geek 011/2534567, 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/2534567
011-9876543
064222-333
322-444
064888999
22/25ETF Beograd::Programiranje 1
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'
23/25ETF 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
24/25ETF 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
25/25ETF Beograd::Programiranje 1