Escaparea caracterelor speciale în expresiile regulate Python
Să presupunem că trebuie să facem astfel încât un caracter special să reprezinte el însuși. Pentru aceasta acesta trebuie escapat folosind backslash. Să vedem câteva exemple.
Exemplu
În următorul exemplu, autorul expresiei regulate a vrut
ca modelul de căutare să arate astfel: litera
'a', apoi plus '+', apoi
litera 'x'. Cu toate acestea, autorul codului
nu a escapat simbolul '+' și de aceea
modelul de căutare de fapt arată astfel:
litera 'a' de una sau mai multe ori,
apoi litera 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Rezultatul executării codului:
'a+x ! ! !'
Exemplu
Acum autorul a escapat plusul cu backslash.
Acum modelul de căutare arată așa
cum trebuie: litera 'a', apoi plus
'+', apoi litera 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Rezultatul executării codului:
'! ax aax aaax'
Exemplu
În acest exemplu modelul arată astfel:
litera 'a', apoi punct '.',
apoi litera 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Rezultatul executării codului:
'! abx azx'
Exemplu
În următorul exemplu autorul a uitat să escape slashul și sub expresia regulată au fost capturate toate subșirurile, deoarece punctul neescapat reprezintă orice caracter:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Rezultatul executării codului:
'! ! !'
Observație
Atenție la faptul că dacă uitați backslash-ul pentru punct (când acesta ar trebui să reprezinte el însuși) - acest lucru poate să nu fie observat:
res = re.sub('a.x', '!', 'a.x')
print(res) # va returna '!', așa cum am vrut
Vizual funcționează corect (deoarece punctul
reprezintă orice caracter, inclusiv
punctul obișnuit '.'). Dar dacă schimbăm
șirul în care se fac înlocuirile - vom
vedea greșeala noastră:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # va returna '! ! !', dar se aștepta '! abx azx'
Lista caracterelor speciale și obișnuite
Dacă escapați un caracter obișnuit - nu se va întâmpla nimic rău - acesta va reprezenta oricum el însuși. Excepție - cifrele, acestea nu pot fi escapare.
Deseori apare îndoiala dacă un anumit simbol este special. Unii ajung să escapeze toate caracterele suspecte la rând. Cu toate acestea, aceasta este o practică proastă (încarcă expresia regulată cu backslash-uri).
Sunt caractere speciale: $ ^ . * + ? \ / {} [] () |
Nu sunt caractere speciale: @ : , ' " - _ = < > % # ~ `& !
Probleme practice
Este dat șirul:
txt = 'a.a aba aea'
Scrieți o expresie regulată care va găsi șirul
'a.a', fără a captura celelalte.
Este dat șirul:
txt = '2+3 223 2223'
Scrieți o expresie regulată care va găsi șirul
'2+3', fără a captura celelalte.
Este dat șirul:
txt = '23 2+3 2++3 2+++3 345 567'
Scrieți o expresie regulată care va găsi șirurile
'2+3', '2++3', '2+++3',
fără a captura celelalte (+ poate fi orice
număr).
Este dat șirul:
txt = '23 2+3 2++3 2+++3 445 677'
Scrieți o expresie regulată care va găsi șirurile
'23', '2+3', '2++3',
'2+++3', fără a captura celelalte.
Este dat șirul:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Scrieți o expresie regulată care va găsi șirurile
'*q+', '*qq+', '*qqq+',
fără a captura celelalte.
Este dat șirul:
txt = '[abc] {abc} abc (abc) [abc]'
Scrieți o expresie regulată care va găsi șirurile
în paranteze pătrate și le va înlocui cu
'!'.