Python регуляр ифодалардаги тўпламлар ичидаги дефис
Дефис - [ ] ичида ҳам maxsus символдир
(аммо ташқарида - эмас). Агар сизга дефис ўзи
символ сифатида керак бўлса - уни гурух
ажратиб белувчи сифатида қабул қилинмайдиган
жойга қўйинг.
Бу нега муҳим: сиз ўзингиз сезмай символлар
гурухи яратиб қўйишингиз мумкин. Масалан,
шунақа - '[:-@]' - сиз қос инуқта,
дефис ва итни танлайётганингиздай ўйлашингиз
мумкин, аммо аслида : ва @
ўртасидаги символлар гурухи ҳосил бўлади.
Бу гурухга куйидаги символлар киради: ? < = > :
Улар қаердан келиб чиққан? ASCII жадвалидан - қос инуқтанинг рақами итникидан кичкина - ва натижада гурух ҳосил бўлади. Яъни барча гурухлар ASCII жадвали бўйича ҳосил бўлади (истасангiz, будан фойдаланишингиз мумкин).
Бу билан қандай курашиш керак: дефис символini
ўзи гурух символi сифатида аник қабул қилинмайдиган
жойга, масалан, бошланғич ёки охирига
(яъни [ дан кейин ёки
] дан олдин) қўйинг.
Шунингдек, дефисни экранлаш мумкин - у ҳолда
у ўз ўрнига қарамасдан ўзини англатади.
Масалан, [:-@] ўрнига
[:\-@] ёзиш - ва энди гурух бўлмайди,
балки учта символ - қос инуқта,
дефис ва ит @ бўлади.
Мисол
Куйидаги мисолда қидириш намунаси шундай:
рақам 1, кейин 'a' дан
'z' гача ҳарф, кейин рақам 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Кодни ишга тушириш натижаси:
'! 1-2 ! !'
Мисол
Келгинг, энди дефисни экранлаймиз.
Натижада қидириш намунаси шундай: рақам
1, кейин 'a' ҳарфи, ёки
дефис, ёки 'z' ҳарфи, кейин рақам
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Кодни ишга тушириш натижаси:
'! ! 1c2 !'
Мисол
Уни экранламасдан, сифатини ўзгартириш мумкин дефисни:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Кодни ишга тушириш натижаси:
'! ! 1c2 !'
Мисол
Куйидаги мисолда қидириш намунаси шундай:
биринчи символ - кичик ҳарфлар ёки
дефис '-', кейин иккита 'x'
ҳарфи:
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Кодни ишга тушириш натижаси:
'! Axx ! @xx'
Мисол
Куйидаги мисолда қидириш намунаси шундай:
биринчи символ - кичик, катта
ҳарфлар ёки дефис '-', кейин иккита 'x'
ҳарфи:
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Кодни ишга тушириш натижаси:
'! ! ! @xx'
Мисол
Дефисни икки гурух ўртасига қўйиш мумкин - у ерда у яна бир гурух яратиши аник эмас:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Кодни ишга тушириш натижаси:
'! ! ! @xx'
Амалий машқлар
Берилган сатр:
txt = 'xaz xBz xcz x-z x@z'
Куйидаги намуна бўйича барча сатрларни топиng:
'x' ҳарфи, катта ёки кичик
ҳарф ёки дефис, 'z' ҳарфи.
Берилган сатр:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Куйидаги намуна бўйича барча сатрларни топиng:
'x' ҳарфи, кейин ё доллар, ёки
дефис ёки плюс, кейин 'z' ҳарфи.