Escapování speciálních znaků v regulárních výrazech Pythonu
Předpokládejme, že potřebujeme, aby speciální znak představoval sám sebe. K tomu je třeba jej escapovat pomocí zpětného lomítka. Podívejme se na příkladech.
Příklad
V následujícím příkladu autor regulárního výrazu chtěl,
aby vyhledávací vzor vypadal takto: písmeno
'a', poté plus '+', poté
písmeno 'x'. Avšak autor kódu
neescapoval symbol '+', a proto
vyhledávací vzor ve skutečnosti vypadá takto:
písmeno 'a' jednou nebo vícekrát,
poté písmeno 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Výsledek provedení kódu:
'a+x ! ! !'
Příklad
A nyní autor escapoval plus zpětným
lomítkem. Nyní vyhledávací vzor vypadá tak,
jak má: písmeno 'a', poté plus
'+', poté písmeno 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Výsledek provedení kódu:
'! ax aax aaax'
Příklad
V tomto příkladu vzor vypadá takto:
písmeno 'a', poté tečka '.',
poté písmeno 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Výsledek provedení kódu:
'! abx azx'
Příklad
V následujícím příkladu autor zapomněl escapovat tečku a pod regulární výraz spadly všechny podřetězce, protože neescapovaná tečka představuje libovolný znak:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Výsledek provedení kódu:
'! ! !'
Poznámka
Všimněte si, že pokud zapomenete zpětné lomítko pro tečku (když by měla představovat samu sebe) - lze to snadno přehlédnout:
res = re.sub('a.x', '!', 'a.x')
print(res) # vrátí '!', jak jsme chtěli
Vizuálně to funguje správně (protože tečka
představuje libovolný znak, včetně
obyčejné tečky '.'). Ale pokud změníme
řetězec, ve kterém se provádějí nahrazení -
uvidíme naši chybu:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # vrátí '! ! !', ale očekávalo se '! abx azx'
Seznam speciálních a obyčejných symbolů
Pokud escapujete obyčejný symbol - nic se nestane - bude stále představovat sám sebe. Výjimkou jsou číslice, ty nelze escapovat.
Často vzniká pochybnost, zda je daný symbol speciální. Někteří docházejí k tomu, že escapují všechny podezřelé symboly najednou. To je však špatná praxe (zaneřádí regulární výraz zpětnými lomítky).
Speciálními symboly jsou: $ ^ . * + ? \ / {} [] () |
Nejsou speciálními symboly: @ : , ' " - _ = < > % # ~ `& !
Praktické úlohy
Daný řetězec:
txt = 'a.a aba aea'
Napište regulární výraz, který najde řetězec
'a.a', a nezachytí ostatní.
Daný řetězec:
txt = '2+3 223 2223'
Napište regulární výraz, který najde řetězec
'2+3', a nezachytí ostatní.
Daný řetězec:
txt = '23 2+3 2++3 2+++3 345 567'
Napište regulární výraz, který najde řetězce
'2+3', '2++3', '2+++3',
a nezachytí ostatní (+ může být libovolný
počet).
Daný řetězec:
txt = '23 2+3 2++3 2+++3 445 677'
Napište regulární výraz, který najde řetězce
'23', '2+3', '2++3',
'2+++3', a nezachytí ostatní.
Daný řetězec:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Napište regulární výraz, který najde řetězce
'*q+', '*qq+', '*qqq+',
a nezachytí ostatní.
Daný řetězec:
txt = '[abc] {abc} abc (abc) [abc]'
Napište regulární výraz, který najde řetězce
v hranatých závorkách a nahradí je
'!'.