You are on page 1of 9

ELEKTROTEHNIKI FAKULTET BANJA LUKA TEORETSKE OSNOVE RAUNARSTVA A405

REGULARNI IZRAZI U FUNKCIJI PRETRAIVANJA TEKSTA


Uvod Regularni izrazi (eng. REGular EXpressions) obezbeuju algebarski (deklarativni) opis nekog regularnog jezika, tj. oni generiu rei koje pripadaju datom jeziku. Regularni jezik je skup sekvenci simbola nekog alfabeta. Regularnih izrazi formiraju se analogno aritmetikim izrazima upotrebom operatora kombinuju se manji izrazi. Regularni izrazi su od nastanka bili korisno sredstvo z a pretraivanje i automatizovano ureivanje teksta. U tu svrhu koristila se sintaksa karakteristina za Unix alate, koja se ipak razlikovala od alata do alata. IEEE POSIX Basic Regular Expressions (BRE) standard je uveden zbog kompatibilnosti sa tradicionalnom sintaksom, a prihvaen je kao podrazumevana sintaksa regularnih izraza mnogih Unix alata. Uz osnovnu sintaksu (BRE) uvedena je i proirena sintaksa (Extended Regular Expressions ERE). Ovde e biti opisana i koritena proirena sintaksa regularnih izraza. Sintaksa U tabeli 1 date su komponente i primeri regularnih izraza, kao i njihovi formalni ekvivalenti.
Tabela 1. Komponente i primeri regularnih izraza

Regularni izraz Literali


a

Formalno opisan regularni izraz


a

Opis
Znakovi koji nisu specijalni (kao to su npr. mala i velika slova, brojevi, znak _, itd.) imaju doslovno znaenje (eng. literal). Npr. regularni izraz a poklapa se sa prvim a u nizu znakova raunar. Ovaj regularni izraz se poklapa i sa drugim a, ali je potrebno automat (regex engine) podesiti tako da nastavi pretragu nakon to nae poklapanje.

Konkatenacija
abc

abc

Konkatenacija literala, odnosno regularnih izraza.

Unija literala
[abcd] [a-d] [-ad] [ad-] [-a-d] [a-d-] [a\-d]

a+b+c+d a+b+c+d -+a+d a+d+-+a+b+c+d a+b+c+d+a+-+d

Za uniju literala koriste se izrazi u srednjim zagradama. Znak - se moe koristiti za specifikovanje intervala. Ukoliko se znak - nalazi na prvom ili poslednjem mestu unutar zagrada, tada ima literalno znaenje (znak minus). Ukoliko se znak - ne nalazi na prvom ili poslednjem mestu unutar zagrada, da bi imao literalno znaenje potrebno je koristi escape karakter \. [a\-d] predstavlja uniju znakova a, - i d.

Unija izraza
abc|def

abc+def

Znak | (eng. pipe) koristi se za specifikovanje unije rei.

Opcioni podizraz
a?

(+a)

Najvie jedno ponavljanje podizraza na koji se primenjuje. a?b?c opisuje nizove: abc ac bc c

Zagrade
abc? (abc)?

ab(+c) (+abc)

Koriste se kako za redefinisanje prioriteta operatora tako i za definisanje podizraza. Match-evi podizraza se pamte i mogu se referencirati kasnije unutar regularnog izraza (eng. back-reference). abc? (abc)? opisuje nizove: ab abc opisuje nizove: abc

* zatvorenost
a* (abc)*

a* (abc)*

Ponavljanje nula ili vie puta podizraza na koji se primenjuje. a* (abc)* opisuje nizove: a aa aaa ... opisuje nizove: abc abcabc abcabcabc ...

+ zatvorenost
a+ (abc)+

aa* abc(abc)*

Najmanje jedno ponavljanje podizraza na koji se primenjuje. a+ (abc)+ opisuje nizove: a aa aaa ... opisuje nizove: abc abcabc abcabcabc ...

Specijalni znakovi
? + * ( ) [ ] | . \

Specijalni znakovi imaju specijalna znaenja. Ukoliko se ele koristiti kao literali, potrebno je koristiti escape sekvence (ispred specijalnog znaka stavlja se specijalni znak \). Alternativno, moe se koristiti operator [ ] sa jednim elementom (unutar srednjih zagrada specijalni znakovi gube specijalno znaenje). Na primer, izrazi etfbl\.net i etfbl[.]net poklapaju se sa nizom etfbl.net. Specijalni znak . menja bilo koji znak, osim znaka za novi red. Dobija specijalno znaenje kada se nalazi na poetku izraza: oznaava poetak reda. Znak ^ dobija specijalno znaenje i kada se nalazi na prvom mestu unutar srednjih zagrada: oznaava sve osim onoga to je navedeno nakon znaka ^. [^abcd] [^a-z] oznaava sve osim znakova a, b, c i d. oznaava sve osim malih slova.

^ [^abcd]

$ {n}

[a^d] predstavlja uniju znakova a, ^ i d. Dobija specijalno znaenje kada se nalazi na kraju izraza: oznaava kraj reda. Tano n ponavljanja podizraza na koji se primenjuje. abc{2} oznaava: abcc (abc){2} oznaava: abcabc

{n,}

{,m}

{n,m}

\t \b \< \> \w \W \d \D \N

gde je N jednocifren prirodan broj

Najmanje n ponavljanja podizraza na koji se primenjuje. abc{2,} oznaava nizove: abcc, abccc, ... (abc){2,} oznaava nizove: abcabc, abcabcabc, ... Najvie m ponavljanja podizraza na koji se primenjuje. abc{,3} oznaava nizove: ab, abc, abcc, abccc (abc){,3} oznaava nizove: , abc, abcabc, abcabcabc Najmanje n, a najvie m ponavljanja podizraza na koji se primenjuje. abc{2,3} oznaava nizove: abcc, abccc (abc){2,3} oznaava nizove: abcabc, abcabcabc tab Prazan string na poetku ili na kraju rei (granica rei). Prazan string na poetku rei. Prazan string na kraju rei. Znak koji moe biti u sastavu rei (eng. word-constituent). To su mala i velika slova, cifre i znak _. Znak koji ne moe biti u sastavu rei (eng. non-wordconstituent). Bilo koja cifra. Svi znakovi osim cifara. Pozivanje na N-ti podizraz regularnog izraza (backreference). Na primer,
(ab)(cd)\2\1 (ab(c))\1 (a.)\1

oznaava: abcdcdab oznaava: abcabc oznaava nizove: aaaa, abab, acac, ..., a0a0, a1a1, ... , a?a?, ...

Pohlepnost operatora Standardno, operatori u regularnim izrazima su pohlepni (eng. greedy), to znai da e traiti najduu moguu sekvencu kao match (tabela 2).
Tabela 2. Pohlepnost operatora

Regularni izraz
a(bc)? a* a.*d ".*" "[^"]*"

Ulaz/Match
abc aaaa abcd abcd abcd "Tekst" pod "navodnicima" "Tekst" pod "navodnicima"

Pohlepnost operatora treba imati na umu kada se konstruiu sloeniji regularni izrazi. Na primer, regularni izraz kojim se pronalaze svi nizovi znakova koji se nalaze pod znakovima navoda ne moe se napisati na sledei nain:
".*"

jer ukoliko je na ulazu tekst: "Tekst" pod "navodnicima" match e biti itav tekst, odnosno svi znakovi od prvog do poslednjeg znaka ", pa je zbog toga potrebno modifikovati izraz. Dakle, izraz kojim se pronalaze svi nizovi znakova koji se nalaze pod znakovima navoda moe se napisati na sledei nain:
"[^"]*"

Klase znakova Ponekad je, umesto navoenja niza znakova unutar operatora [ ] pogodno koristiti tzv. klase znakova. Sintaksa:
[:naziv_klase:]

gde sekvence [: i :] oznaavaju poetak i kraj naziva klase i nemaju veze sa operatorom unije znakova, odnosno [ ]. Na primer, klasa koja predstavlja mala slova, sinonim za a-z, je:
[:lower:]

Ukoliko se pomenuta klasa eli iskoristiti za regularni izraz koji opisuje jedan znak iz skupa malih slova, potrebno je koristiti konstrukciju:
[[:lower:]]

U tabeli 3 dat je prikaz esto koritenih klasa znakova.


Tabela 3. Klase znakova

Regularni izraz
[:alnum:] [:alpha:] [:blank:] [:digit:] [:lower:] [:punct:] [:space:] [:upper:] [:word:] [:xdigit:]

Opis
Mala i velika slova i brojevi. Sinonim za [:alpha:][:digit:]. Mala i velika slova. Sinonim za a-zA-Z, odnosno [:lower:][:upper:]. space, tab Cifre. Sinonim za 0-9 . Mala slova. Sinonim za a-z. !"#$%&'()*+, -./:;<=>?@[\]^_`{|}~ space, tab, carriage return, newline , vertical tab, form feed Velika slova. Sinonim za A-Z. Znakovi rei. Sinonim za a-zA-Z0-9_. Heksadecimalne cifre. Sinonim za 0-9a-fA-F.

Provera sintakse regularnih izraza Provera sintakse regularnih izraza moe se izvesti, na primer, koritenjem nekog od boljih tekstualnih editora (npr. Notepad++), nekog online alata (npr. RegexPal) ili koritenjem Unixovog alata grep. Prilikom provere sintakse treba obratiti panju na to da Notepad++ i RegexPal ne podravaju sve komponente regularnih izraza. Notepad++ Nakon to se u editoru otkuca, ili kopira tekst nad kojim se ele primenjivati regularni izrazi, koritenjem opcije Find sa ukljuenim flegom za regularne izraze mogue je odmah proveriti koje podnizove teksta opisuje specifikovani izraz (sl. 1).

Slika 1. Primer pretrage u editoru Notepad++ koritenjem regularnih izraza

RegexPal RegexPal je online alat za testiranje regularnih izraza (sl. 2). Nalazi se na adresi: http://regexpal.com.

Slika 2. RegexPal online alat za testiranje regularnih izraza

grep grep je Unix-ov alat koji slui za pretraivanje teksta. grep razume tri verzije sintakse regularnih izraza: osnovnu, proirenu i perl sintaksu. U GNU grep-u nema razlike u dostupnoj funkcionalnosti osnovne i proirene sintakse, dok u drugim implementacijama, osnovni regularni izrazi nisu toliko moni koliko i proireni regularni izrazi. U osnovnim regularnim izrazima specijalni znakovi ?, +, {, |, (, i ) gube svoje specijalno znaenje, pa je potrebno koristiti escape sekvence: \?, \+, \{, \|, \(, i \). Opti oblik grep naredbe je:
grep [opcije] "regularni_izraz" [naziv_ulaznog_fajla...]

grep pretrauje ulazne fajlove (ili standardni ulaz ukoliko nije specifikovan nijedan naziv ulaznog fajla, ili je specifikovan znak - kao naziv ulaznog fajla) i ispisuje linije u kojima pronalazi match-eve za zadani regularni izraz. Neke od osnovnih opcija su: -E, --extended-regexp Specifikovani izraz se interpretira kao proireni regularni izraz. --color[=WHEN], --colour[=WHEN] Okruuje match-eve odgovarajuim escape sekvencama da bi se mogli prikazati u boji na terminalu. WHEN moe biti: always, never ili auto. -o, --only-match Prikazuje samo match-eve (svaki match u novom redu), a ne kompletan sadraj linije u kojoj se nalazi match. Dvostruki navodnici nisu specijalni znak u regularnim izrazima. Meutim, kada se koristi grep, on se poziva iz shell-a Unix-a. U shell-u navodnici imaju specijalno znaenje i ograniavaju nizove znakova (kao to je, na primer, celi regularni izraz), pa se navodnici koji se koriste kao literali, bez izuzetka moraju pisati kao sekvenca: \". Primer koritenja grep-a dat je na sl. 3.

Slika 3. Primer koritenja grep-a

Detaljnije informacije o grep-u mogu se dobiti koritenjem naredbe man:


man grep

sed Za automatizovano ureivanje tekstualnih fajlova (ili bilo kog stream-a) pomou regularnih izraza pod Unix operativnim sistemima, esto se koristi program pod nazivom sed (Stream EDitor). Detaljna analiza sed-a izlazi van okvira ovog predmeta, ali e ipak biti koriten, dodue u jednostavnoj varijanti:
sed r "s/regex/zamena/[flegovi]" [naziv_ulaznog_fajla...]

Ovako pozvan, sed analizira specifikovane ulazne fajlove (ili standardni ulaz ukoliko nije specifikovan nijedan naziv ulaznog fajla, ili je specifikovan znak - kao naziv ulaznog fajla), pronalazi u njima match za regularni izraz regex, zamenjuje taj match izrazom zamena (koji moe sadravati povratne refenence podizraza iz regex-a) i prosleuje rezultat na izlaz. Opcija -r oznaava da se koriste proireni regularni izrazi, a flegovi su opcioni modifikatori rada sed-a. Podrazumevano, sed prestaje pretraivati liniju im pronae prvi match i ostatak linije prosleuje bez promene na izlaz. Ukoliko se eli nastaviti pretraivanje do kraja linije, koristi se fleg g (eng. global). Ukoliko se eli pretraivanje koje nije osetljivo na veliinu slova, koristi se fleg i (eng. ignore). Primer koritenja sed-a dat je na sl. 4.

Slika 4. Primer koritenja sed-a

Detaljnije informacije o sed-u mogu se dobiti koritenjem naredbe man:


man sed

Primeri
Tabela 4. Primeri regularnih izraza

Regularni izraz
(a.)(a.) (a.)\1 (ab(c))\1 (ab(c))\2 ([abc]+)\1 ([abc])+\1 ([0-9])\1+ (.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)\9\ 8\7\6\5\4\3\2\1 (.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\ 9\8\7\6\5\4\3\2\1 a.*d "[^"]*" [a-f]?[24-70]+[:-]?

Ulaz/Match
abab abac abab abac abcabc abcc abcabc abcc abcabc abca abcb abcc abcabc abca abcb abcc 8746 2222 abba anavolimilovana abba anavolimilovana abcd abcd abcd "Tekst" pod "navodnicima" a2:di bf69 334 278 ca4 1. jedan dva (2) 3. (3) 4. test 45 6.11 96.2 78.3332 203a+ss) (a-2)+(53/a) (a+b)^4444b) (1+3a)(2*4ha) 12.6E-12 e45 2359 -11ek 99e9 23nb2345 1230 99222 999999992 1999-07-20 1898.07-21 12-06-2009 3.56 78 1.2 4 4.678 nikola@urc.bl.ac.yu marko.markovic@ milan@etfbl. petar@spinter.net

^[^a-z]+[a-z]+$

[6-9]+[.][0-9]{2}

([(]?[[:alnum:]]+[+/*^]+[[:alnum:]]{1,4 }[)]?)+

((\b[0-9]+)?\.)?\b[0-9]+([eE][-+]?[09]+)?\b

\b[1-9][0-9]{3,5}\b

(18|19)[0-9][0-9][-](0[1-9]|1[012])[](0[1-9]|[12][0-9]|3[01]) \b[3-5]\b|[3-4][.][0-9]+

^[\_]*([a-z0-9]+(\.|\_*)?)+@([a-z][az0-9\-]+(\.|\-*\.))+[a-z]{2,6}$

Tabela 5. Primeri koritenja sed-a

Naredba
sed -r "s/[0-9]/cifra/"

Ulaz
1 123 12 1 123 12 jedan dva tri cetiri Moj e-mail je: marko@gmail.com "abc" "abc" def "ghi" "abc" "abc" def "ghi"

Izlaz
cifra cifra 2 3 cifra 2 cifra cifra cifra cifra cifra jedan avd irt cetiri Moj e-mail je: marko (at) gmail DOT com

sed -r "s/[0-9]/cifra/g"

sed -r "s/\b(.?)(.?)(.?)\b/\3\2\1/g" sed -r "s/([[:alpha:]]\w*)@([[:alpha:]]\w*)\. (com|net|org)/\1 (at) \2 DOT \3/gi" sed -r "s/\".*\"//g" sed -r "s/\"[^\"]*\"//g"

def

You might also like