Екраниране на специални символи в регулярни изрази в Python

Да предположим, че трябва да направим така, че специален символ да означава себе си. За целта трябва да го екранираме с помощта на обратна наклонена черта. Нека да разгледаме примери.

Пример

В следващия пример авторът на регулярния израз искал шаблонът за търсене да изглежда така: буква 'a', следван от плюс '+', следван от буква 'x'. Обаче, авторът на кода не е екранирал символа '+' и затова шаблонът за търсене всъщност изглежда така: буква 'a' един или повече пъти, следван от буква 'x':

pythontxt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)

print(res)

Резултат от изпълнението на кода:

python'a+x ! ! !'

Пример

А сега авторът е екранирал плюса с обратна наклонена черта. Сега шаблонът за търсене изглежда така, както трябва: буква 'a', следван от плюс '+', следван от буква 'x':

pythontxt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)

print(res)

Резултат от изпълнението на кода:

python'! ax aax aaax'

Пример

В този пример шаблонът изглежда така: буква 'a', следван от точка '.', следван от буква 'x':

pythontxt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)

print(res)

Резултат от изпълнението на кода:

python'! abx azx'

Пример

В следващия пример авторът забравил да екранира точката и на регулярния израз отговарят всички поднизове, тъй като неекранираната точка означава произволен символ:

pythontxt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)

print(res)

Резултат от изпълнението на кода:

python'! ! !'

Забележка

Обърнете внимание, че ако заберете обратната наклонена черта за точката (когато тя трябва да означава сама себе си) - това може дори да не се забележи:

pythonres = re.sub('a.x', '!', 'a.x')
print(res) # връща '!', както сме искали

Визуално работи правилно (тъй като точката означава произволен символ, включително и обикновена точка '.'). Но ако променим низа, в който се извършват замените - ние ще видим нашата грешка:

pythonres = re.sub('a.x', '!', 'a.x abx azx')
print(res) # връща '! ! !', а се очакваше '! abx azx'

Списък на специални и обикновени символи

Ако екранирате обикновен символ - нищо лошо няма да се случи - той все пак ще означава себе си. Изключение - цифрите, те не могат да бъдат екранирани.

Често възниква съмнение дали даден символ е специален. Някои хора стигат дотам, че екранират всички подозрителни символи наведнъж. Обаче, това е лоша практика (запълва регулярния израз с обратни наклонени черти).

Специални символи са: $ ^ . * + ? \ / {} [] () |

Не са специални символи: @ : , ' " - _ = < > % # ~ `& !

Практически задачи

Задание 1

Даден е низ:

pythontxt = 'a.a aba aea'

Напишете регулярен израз, който ще намери низа 'a.a', без да улавя останалите.

Задание 2

Даден е низ:

pythontxt = '2+3 223 2223'

Напишете регулярен израз, който ще намери низа '2+3', без да улавя останалите.

Задание 3

Даден е низ:

pythontxt = '23 2+3 2++3 2+++3 345 567'

Напишете регулярен израз, който ще намери низовете '2+3', '2++3', '2+++3', без да улавя останалите (+ може да бъде произволен брой).

Задание 4

Даден е низ:

pythontxt = '23 2+3 2++3 2+++3 445 677'

Напишете регулярен израз, който ще намери низовете '23', '2+3', '2++3', '2+++3', без да улавя останалите.

Задание 5

Даден е низ:

pythontxt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'

Напишете регулярен израз, който ще намери низовете '*q+', '*qq+', '*qqq+', без да улавя останалите.

Задание 6

Даден е низ:

pythontxt = '[abc] {abc} abc (abc) [abc]'

Напишете регулярен израз, който ще намери низовете в квадратни скоби и ще ги замени с '!'.