Python регуляр ифодаларида мусбат ва салбий кўриб чиқиш
Бaъзан шундай вазифани ечиш керак бўлади:
'aaa' сатрни топиш ва уни
'!' га алмаштириш, лекин факат
'aaa' дан кейин 'x' турганда, ўзи
'x' ни эса алмаштирилмасин. Агар биз
вазифани 'тўғридан-тўғри' ечишга ҳаракат қилсак,
ундурма олмаймиз:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # чикади '! baaa', лекин '!x baaa' деб уйлаган эдик
Олдга кўриб чиқиш
Вазифани ечиш учун 'x' ни алмаштириш
шарт эмаслигини айтиб берадиган усул керак.
Бундай (?= ) махсус қавслар ёрдамида
бажарилади, улар факат кўриб чиқади, лекин
ўзлари билан олмайди.
Бу қавслар мусбат олдга кўриб чиқиш
дейилади. Мусбат - чунки 'x'
(бизнинг ҳолатимизда) бўлиши керак - факат
ўша пайтдагина алмаштириш амалга ошади.
Келинг, ушбу қавсларни бизнинг вазифани ечиш учун қўллаймиз:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # чикади '!x aaab
Салбий олдга кўриб чиқиш ҳам мавжуд
- (?! ) - у, аксінча, бирор нарса
бўлмаслиги кераклигини айтади. Келеси
мисолда, алмаштириш факат 'aaa' дан кейин
'x' бўлмагандагина амалга ошади:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # чикади 'aaax !b'
Ортга кўриб чиқиш
Худди шунингдек мусбат ортга кўриб чиқиш
- (?<= ) ҳам мавжуд. Келеси
мисолда, алмаштириш факат 'aaa' дан олдин
'x' тургандагина амалга ошади:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # чикади 'x!'
Шунингдек салбий ортга кўриб чиқиш
- (?<! ) ҳам мавжуд. Келеси мисолда
алмаштириш факат 'aaa' дан олдин
'x' бўлмагандагина амалга ошади:
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # чикади 'b!'
Амалий вазифалар
Функция номларини ўз ичига олган сатр берилган:
txt = 'func1() func2() func3()'
Сатрдан функция номлари массивини олинг.
Тег билан сатр берилган:
txt = '<a href="" class="eee" id="zzz">'
Ушбу тегнинг атрибут номлари массивини олинг.
Ўзгарувчилар билан сатр берилган:
txt = '$aaa $bbb $ccc xxxx'
Олдида доллар белгиси турган қисм сатрларни олинг.