Ekranizimi i Simboleve Speciale në Regex Python
Supozoni se duhet të bëni që simboli special të përfaqësojë vetveten. Për këtë ai duhet të ekranizohet duke përdorur backslash. Le të shohim me shembuj.
Shembull
Në shembullin vijues, autori i regex donte
që modeli i kërkimit të dukej kështu: shkronja
'a', pastaj plus '+', pastaj
shkronja 'x'. Megjithatë, autori i kodit
nuk e ka ekranizuar simbolin '+' dhe për këtë arsye
modeli i kërkimit në të vërtetë duket kështu:
shkronja 'a' një ose më shumë herë,
pastaj shkronja 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Rezultati i ekzekutimit të kodit:
'a+x ! ! !'
Shembull
Tani autori e ka ekranizuar plus-in me
backslash. Tani modeli i kërkimit duket ashtu
sic duhet: shkronja 'a', pastaj plus
'+', pastaj shkronja 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Rezultati i ekzekutimit të kodit:
'! ax aax aaax'
Shembull
Në këtë shembull, modeli duket kështu:
shkronja 'a', pastaj pikë '.',
pastaj shkronja 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Rezultati i ekzekutimit të kodit:
'! abx azx'
Shembull
Në shembullin vijues autori harroi të ekranizonte pikën dhe nën regex kanë rënë të gjitha nënvargjet, sepse pika e paekranizuar përfaqëson çdo simbol:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Rezultati i ekzekutimit të kodit:
'! ! !'
Vërejtje
Kushtojini vëmendje faktit që nëse ju harroni backslash për pikën (kur ajo duhet të përfaqësojë vetveten) - kjo mund të mos vihet re:
res = re.sub('a.x', '!', 'a.x')
print(res) # kthen '!', ashtu siç donim
Vizualisht funksionon siç duhet (pasi pika
përfaqëson çdo simbol, përfshirë edhe
pikën e zakonshme '.'). Por nëse ndryshojmë
vargun, në të cilin ndodhin zëvendësimet - ne
do të shohim gabimin tonë:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # kthen '! ! !', por pritej '! abx azx'
Lista e simboleve speciale dhe të zakonshme
Nëse ekranizoni një simbol të zakonshëm - asgjë e tmerrshme nuk do të ndodhë - ai prapë do të përfaqësojë vetveten. Përjashtim - shifrat, ato nuk mund të ekranizohen.
Shpesh lind dyshimi, nëse një simbol i caktuar është special. Disa njerëz arrijnë deri aty që ekranizojnë të gjitha simbolet të dyshimta radhazi. Megjithatë, kjo është praktikë e keqe (e bën regex të ndyrë me backslashe).
Janë simbole speciale: $ ^ . * + ? \ / {} [] () |
Nuk janë simbole speciale: @ : , ' " - _ = < > % # ~ `& !
Detyra praktike
Është dhënë vargu:
txt = 'a.a aba aea'
Shkruani një regex që do të gjejë vargun
'a.a', pa kapur të tjerët.
Është dhënë vargu:
txt = '2+3 223 2223'
Shkruani një regex që do të gjejë vargun
'2+3', pa kapur të tjerët.
Është dhënë vargu:
txt = '23 2+3 2++3 2+++3 345 567'
Shkruani një regex që do të gjejë vargjet
'2+3', '2++3', '2+++3',
pa kapur të tjerët (+ mund të jetë çdo
numër).
Është dhënë vargu:
txt = '23 2+3 2++3 2+++3 445 677'
Shkruani një regex që do të gjejë vargjet
'23', '2+3', '2++3',
'2+++3', pa kapur të tjerët.
Është dhënë vargu:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Shkruani një regex që do të gjejë vargjet
'*q+', '*qq+', '*qqq+',
pa kapur të tjerët.
Është dhënë vargu:
txt = '[abc] {abc} abc (abc) [abc]'
Shkruani një regex që do të gjejë vargjet
në kllapa katrore dhe do t'i zëvendësojë ato
me '!'.