⊗pyPmREESCh 36 of 129 menu

Екраниране на специални символи в регулярни изрази в 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]'

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

Български
AfrikaansAzərbaycanবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ние използваме бисквитки за работата на сайта, анализ и персонализация. Обработката на данни се извършва в съответствие с Политика за поверителност.
приемам всички настройки отхвърляне