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]'
Шаршы жақшалардағы жолдарды тауып, оларды '!'
таңбасына ауыстыратын реттік өрнек жазыңыз.