Speciális karakterek escape-elése Python reguláris kifejezésekben
Tegyük fel, hogy azt szeretnénk elérni, hogy egy speciális karakter önmagát jelölje. Ehhez escape-elni kell egy visszaperjelell. Nézzük meg példákon keresztül.
Példa
A következő példában a reguláris kifejezés szerzője azt szerette volna,
hogy a keresési minta így nézzen ki: 'a'
'a' betű, majd egy plusz '+',
majd 'x' betű. A kód szerzője azonban
nem escape-elte a '+' karaktert, ezért
a keresési minta valójában így néz ki:
'a''a' betű egy vagy többször,
majd 'x' betű:
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
A kód végrehajtásának eredménye:
'a+x ! ! !'
Példa
Ebben a példában a szerző escape-elte a pluszt
egy visszaperjelell. Most a keresési minta
úgy néz ki, ahogy kellene: 'a''a' betű,
majd plusz '+', majd 'x' betű:
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
A kód végrehajtásának eredménye:
'! ax aax aaax'
Példa
Ebben a példában a minta így néz ki:
'a''a' betű, majd pont '.',
majd 'x' betű:
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
A kód végrehajtásának eredménye:
'! abx azx'
Példa
A következő példában a szerző elfelejtette escape-elni a pontot, és a reguláris kifejezés mindig találatot ad, mivel az escape-elatlan pont bármely karaktert jelent:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
A kód végrehajtásának eredménye:
'! ! !'
Megjegyzés
Figyeljük meg, hogy ha elfelejtjük a visszaperjelet a pont escape-eléséhez (amikor önmagát kellene jelölje) - ezt talán észre sem vesszük:
res = re.sub('a.x', '!', 'a.x')
print(res) # visszaadja '!'-t, ahogy szerettük volna
Vizuálisan helyesen működik (mivel a pont
bármely karaktert jelent, beleértve a
közönséges pontot '.' is). De ha megváltoztatjuk
a sztringet, amelyben a csere történik -
meglátjuk a hibánkat:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # visszaadja '! ! !'-t, de '! abx azx' várt
Speciális és közönséges karakterek listája
Ha egy közönséges karaktert escape-elünk - nincs semmi baj - továbbra is önmagát fogja jelenteni. Kivételt képeznek a számok, azokat nem szabad escape-elni.
Gyakran merül fel a kérdés, hogy egy adott karakter speciális-e. Vannak, akik addig mennének, hogy az összes gyanús karaktert escape-elik. Ez azonban rossz gyakorlat (összeklászolja a reguláris kifejezést visszaperjelekkel).
Speciális karakterek: $ ^ . * + ? \ / {} [] () |
Nem speciális karakterek: @ : , ' " - _ = < > % # ~ `& !
Gyakorlati feladatok
Adott a következő sztring:
txt = 'a.a aba aea'
Írj olyan reguláris kifejezést, amely megtalálja
a 'a.a' sztringet, anélkül, hogy a többit is kiválasztaná.
Adott a következő sztring:
txt = '2+3 223 2223'
Írj olyan reguláris kifejezést, amely megtalálja
a '2+3' sztringet, anélkül, hogy a többit is kiválasztaná.
Adott a következő sztring:
txt = '23 2+3 2++3 2+++3 345 567'
Írj olyan reguláris kifejezést, amely megtalálja
a '2+3', '2++3', '2+++3'
sztringeket, anélkül, hogy a többit is kiválasztaná
(a + bármennyi lehet).
Adott a következő sztring:
txt = '23 2+3 2++3 2+++3 445 677'
Írj olyan reguláris kifejezést, amely megtalálja
a '23', '2+3', '2++3',
'2+++3' sztringeket, anélkül, hogy a többit is kiválasztaná.
Adott a következő sztring:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Írj olyan reguláris kifejezést, amely megtalálja
a '*q+', '*qq+', '*qqq+'
sztringeket, anélkül, hogy a többit is kiválasztaná.
Adott a következő sztring:
txt = '[abc] {abc} abc (abc) [abc]'
Írj olyan reguláris kifejezést, amely megtalálja
a szögletes zárójelek közé zárt sztringeket
és '!'-ra cseréli őket.