Екраниране на специални символи в регулярни изрази в Python
Да предположим, че трябва да направим така, че специален символ да означава себе си. За целта трябва да го екранираме с помощта на обратна наклонена черта. Нека да разгледаме примери.
Пример
В следващия пример авторът на регулярния израз искал
шаблонът за търсене да изглежда така: буква
'a', следван от плюс '+', следван от
буква 'x'. Обаче, авторът на кода
не е екранирал символа '+' и затова
шаблонът за търсене всъщност изглежда така:
буква 'a' един или повече пъти,
следван от буква 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Резултат от изпълнението на кода:
'a+x ! ! !'
Пример
А сега авторът е екранирал плюса с обратна
наклонена черта. Сега шаблонът за търсене изглежда така,
както трябва: буква 'a', следван от плюс
'+', следван от буква 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Резултат от изпълнението на кода:
'! ax aax aaax'
Пример
В този пример шаблонът изглежда така:
буква '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]'
Напишете регулярен израз, който ще намери низовете
в квадратни скоби и ще ги замени с
'!'.