Escape-ovanje specijalnih znakova u regularnim izrazima Pajtona
Pretpostavimo da treba da postavimo tako da specijalni znak označava samog sebe. Za to ga treba escape-ovati koristeći obrnutu kosu crtu. Hajde da pogledamo na primerima.
Primer
U sledećem primeru, autor regularnog izraza je želeo
da šablon za pretragu izgleda ovako: slovo
'a', zatim plus '+', zatim
slovo 'x'. Međutim, autor koda
nije escape-ovao znak '+' i zato
šablon za pretragu zapravo izgleda ovako:
slovo 'a' jedno ili više puta,
zatim slovo 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Rezultat izvršenja koda:
'a+x ! ! !'
Primer
A sada je autor escape-ovao plus obrnutom
kosom crtom. Sada šablon za pretragu izgleda tako
kako treba: slovo 'a', zatim plus
'+', zatim slovo 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Rezultat izvršenja koda:
'! ax aax aaax'
Primer
U ovom primeru šablon izgleda ovako:
slovo 'a', zatim tačka '.',
zatim slovo 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Rezultat izvršenja koda:
'! abx azx'
Primer
U sledećem primeru autor je zaboravio da escape-uje tačku i pod regularni izraz su došli svi podstringovi, pošto neescape-ovana tačka označava bilo koji znak:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Rezultat izvršenja koda:
'! ! !'
Napomena
Obratite pažnju na to da ako zaboravite obrnutu kosu crtu za tačku (kada ona treba da označava samu sebe) - to se može lako prevideti:
res = re.sub('a.x', '!', 'a.x')
print(res) # vraća '!', kao što smo i želeli
Vizuelno radi ispravno (pošto tačka
označava bilo koji znak, uključujući i
običnu tačku '.'). Ali ako promenimo
string u kome se vrše zamene - videćemo
našu grešku:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # vraća '! ! !', a očekivano je '! abx azx'
Spisak specijalnih i običnih znakova
Ako escape-ujete običan znak - ništa strašno se neće desiti - on će i dalje označavati samog sebe. Izuzetak su cifre, one se ne mogu escape-ovati.
Često se postavlja pitanje da li je određeni znak specijalan. Neki idu dotle da escape-uju sve sumnjive znakove redom. Međutim, to je loša praksa (zagaduje regularni izraz obrnutim kosim crtama).
Specijalni znaci su: $ ^ . * + ? \ / {} [] () |
Nisu specijalni znaci: @ : , ' " - _ = < > % # ~ `& !
Praktični zadaci
Dat je string:
txt = 'a.a aba aea'
Napišite regularni izraz koji će naći string
'a.a', bez hvatanja ostalih.
Dat je string:
txt = '2+3 223 2223'
Napišite regularni izraz koji će naći string
'2+3', bez hvatanja ostalih.
Dat je string:
txt = '23 2+3 2++3 2+++3 345 567'
Napišite regularni izraz koji će naći stringove
'2+3', '2++3', '2+++3',
bez hvatanja ostalih (+ može biti bilo koja
količina).
Dat je string:
txt = '23 2+3 2++3 2+++3 445 677'
Napišite regularni izraz koji će naći stringove
'23', '2+3', '2++3',
'2+++3', bez hvatanja ostalih.
Dat je string:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Napišite regularni izraz koji će naći stringove
'*q+', '*qq+', '*qqq+',
bez hvatanja ostalih.
Dat je string:
txt = '[abc] {abc} abc (abc) [abc]'
Napišite regularni izraz koji će naći stringove
u uglastim zagradama i zameniti ih sa
'!'.