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' кутілган эди
Махсус символлар ва оддий символлар рўйхати
Агар оддий символни экраниласангиз - ҳеч нарса бўлмайди - у ўзини англатаверади. Истисно - рақамлар, уларни экранилаб бўлмайди.
Кўпинча шубҳа пайдо бўлади, мана бу символ махсусми ёки йўқми. Бaъзилар ҳатто барча шубҳали символларни кетма-кет экранилайди. Aммо, бу ёмон амалиёт (регуляр ифодани тескари чиззиқлар билан тўлдиради).
Махсус символлар: $ ^ . * + ? \ / {} [] () |
Махсус символлар эмас: @ : , ' " - _ = < > % # ~ `& !
Амалий масалалар
Сатр берилган:
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]'
Квадрат қавс ичидаги сатрларни топиш ва
уларни '!' га алмаштириш учун регуляр
ифода ёзинг.