25
Programiranje 1 Regularni izrazi na programskom jeziku Python Univerzitet u Beogradu Elektrotehnički fakultet 2020/2021.

Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

Programiranje 1

Regularni izrazina programskom jeziku Python

Univerzitet u Beogradu

Elektrotehnički fakultet

2020/2021.

Page 2: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 3: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 4: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 5: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 6: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 7: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 8: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 9: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 10: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 11: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 12: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 13: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 14: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 15: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 16: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 17: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 18: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 19: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 20: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 21: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 22: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 23: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 24: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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

Page 25: Programiranje 1 Uvod u programski jezik Python · Uvod (1) Obrada teksta je veoma česta aktivnost koja se sprovodi mašinski ⚫Zapisi (logovi) koje proizvode različite aplikacije

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