Escaping posebnih znakov v regularnih izrazih Python
Predpostavimo, da želimo, da poseben znak predstavlja samega sebe. Za to ga moramo escapirati z uporabo poševnice nazaj. Poglejmo si primere.
Primer
V naslednjem primeru je avtor regularnega izraza želel,
da bi vzorec iskanja izgledal takole: črka
'a', nato plus '+', nato
črka 'x'. Vendar avtor kode
ni escapiral znaka '+', zato
vzorec iskanja dejansko izgleda takole:
črka 'a' enkrat ali večkrat,
nato črka 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Rezultat izvajanja kode:
'a+x ! ! !'
Primer
Tokrat je avtor escapiral plus z
poševnico nazaj. Zdaj vzorec iskanja izgleda
tako, kot bi moral: črka 'a', nato plus
'+', nato črka 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Rezultat izvajanja kode:
'! ax aax aaax'
Primer
V tem primeru vzorec izgleda takole:
črka 'a', nato pika '.',
nato črka 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Rezultat izvajanja kode:
'! abx azx'
Primer
V naslednjem primeru je avtor pozabil escapirati poševnico in so bile vse podnize zajete, ker neescapirana pika predstavlja poljuben znak:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Rezultat izvajanja kode:
'! ! !'
Opomba
Bodite pozorni, da če pozabite poševnico nazaj za piko (ko bi morala predstavljati samo sebe) - tega morda sploh ne opazite:
res = re.sub('a.x', '!', 'a.x')
print(res) # vrne '!', kot smo želeli
Vizualno deluje pravilno (ker pika
predstavlja poljuben znak, vključno z
navadno piko '.'). Toda če zamenjamo
niz, v katerem potekajo zamenjave - bomo
videli svojo napako:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # vrne '! ! !', pričakovali pa smo '! abx azx'
Seznam posebnih simbolov in navadnih
Če escapirate navaden znak - se nič hudega ne zgodi - še vedno bo predstavljal samega sebe. Izjema so številke, teh ni mogoče escapirati.
Pogosto se pojavi dvom, ali je določen znak poseben. Nekateri segajo do tega, da escapirajo vse sumljive znake zaporedoma. Vendar je to slaba praksa (onesnaži regularni izraz s poševnicami nazaj).
So posebni znaki: $ ^ . * + ? \ / {} [] () |
Niso posebni znaki: @ : , ' " - _ = < > % # ~ `& !
Praktične naloge
Dan je niz:
txt = 'a.a aba aea'
Napišite regularni izraz, ki bo našel niz
'a.a', ne da bi zajel ostale.
Dan je niz:
txt = '2+3 223 2223'
Napišite regularni izraz, ki bo našel niz
'2+3', ne da bi zajel ostale.
Dan je niz:
txt = '23 2+3 2++3 2+++3 345 567'
Napišite regularni izraz, ki bo našel nize
'2+3', '2++3', '2+++3',
ne da bi zajel ostale (+ je lahko poljubno
število).
Dan je niz:
txt = '23 2+3 2++3 2+++3 445 677'
Napišite regularni izraz, ki bo našel nize
'23', '2+3', '2++3',
'2+++3', ne da bi zajel ostale.
Dan je niz:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Napišite regularni izraz, ki bo našel nize
'*q+', '*qq+', '*qqq+',
ne da bi zajel ostale.
Dan je niz:
txt = '[abc] {abc} abc (abc) [abc]'
Napišite regularni izraz, ki bo našel nize
v oglatih oklepajih in jih zamenjal z
'!'.