Екранирање на специјални карактери во регуларните изрази на Python
Да претпоставиме дека треба да направиме така што специјалниот симбол да го означува самиот себе. За ова треба да се екранира со помош на обратна коса црта. Ајде да погледнеме на примери.
Пример
Во следниот пример авторот на регуларниот израз сакал,
шablonoт за пребарување да изгледа вака: буква
'a', потоа плус '+', потоа
буква 'x'. Сепак, авторот на кодот
не го екранирал симболот '+' и затоa
шablonoт за пребарување всушност изгледа вака:
буква 'a' една или повеќе пати,
потоа буква 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Резултат од извршувањето на кодот:
'a+x ! ! !'
Пример
А сега авторот го екранирал плус со обратна
коса црта. Сега шablonoт за пребарување изгледа така,
како што треба: буква 'a', потоа плус
'+', потоа буква 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Резултат од извршувањето на кодот:
'! ax aax aaax'
Пример
Во овој пример шablonoт изгледа вака:
буква 'a', потоа точка '.',
потоа буква 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Резултат од извршувањето на кодот:
'! abx azx'
Пример
Во следниот пример авторот заборавил да ја екранира косата црта и под регуларниот израз попаднаа сите поднизи, бидејќи неекранираната точка означува кој било симбол:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Резултат од извршувањето на кодот:
'! ! !'
Забелешка
Обрнете внимание на тоа дека ако заборавите обратна коса црта за точка (кога таа треба да го означува самиот себе) - ова може да не се забележи:
res = re.sub('a.x', '!', 'a.x')
print(res) # ќе врати '!', како што сакавме
Визуелно работи правилно (бидејќи точката
означува кој било симбол, вклучувајќи ја и
обичната точка '.'). Но ако се смени
низата, во која се случуваат замени - ќе
ја видиме нашата грешка:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # ќе врати '! ! !', а се очекуваше '! abx azx'
Листа на специјални симболи и обични
Ако се екранира обичен симбол - ништо страшно нема да се случи - тој сепак ќе го означува самиот себе. Исклучок - цифрите, тие не можат да се екранираат.
Често се појавува сомнеж, дали одреден симбол е специјален. Некои одат дотаму што екранираат сите сомнителни симболи еден по друг. Сепак, ова е лоша практика (ја загадува регуларниот израз со обратни коси црти).
Специјални симболи се: $ ^ . * + ? \ / {} [] () |
Не се специјални симболи: @ : , ' " - _ = < > % # ~ `& !
Практични задачи
Дадена е низата:
txt = 'a.a aba aea'
Напишете регуларен израз што ќе ја најде низата
'a.a', без да ги зафати останатите.
Дадена е низата:
txt = '2+3 223 2223'
Напишете регуларен израз што ќе ја најде низата
'2+3', без да ги зафати останатите.
Дадена е низата:
txt = '23 2+3 2++3 2+++3 345 567'
Напишете регуларен израз што ќе ги најде низите
'2+3', '2++3', '2+++3',
без да ги зафати останатите (+ може да биде било кое
количество).
Дадена е низата:
txt = '23 2+3 2++3 2+++3 445 677'
Напишете регуларен израз што ќе ги најде низите
'23', '2+3', '2++3',
'2+++3', без да ги зафати останатите.
Дадена е низата:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Напишете регуларен израз што ќе ги најде низите
'*q+', '*qq+', '*qqq+',
без да ги зафати останатите.
Дадена е низата:
txt = '[abc] {abc} abc (abc) [abc]'
Напишете регуларен израз што ќе ги најде низите
во квадратни загради и ќе ги замени со
'!'.