Kuzuia Ushindani Katika Usemi wa Kawaida katika Python
Misemo ya kawaida kwa chaguo-msingi ni mlishi. Hii inamaanisha kuwa hunasa idadi kubwa iwezekanavyo ya herufi. Hebu tuchambue kwa mfano. Hebu tuseme tuna mstari kama huu:
txt = 'aeeex zzz x kkk'
Katika mstari huu, tunataka kupata kipande cha mstari
'aeeex' kulingana na muundo ufuatao:
herufi 'a', kisha herufi yoyote
moja au zaidi, kisha herufi 'x':
res = re.sub('a.+x', '!', txt)
print(res)
Ingawa tunahitaji kupata mstari '! zzz
x kkk', mstari '! kkk' utachapishwa.
Shida yote ni kwamba usemi wetu wa kawaida unatafuta
herufi zote kutoka herufi 'a' hadi herufi
'x'. Lakini katika mstari wetu kuna herufi mbili
'x'! Kwa sababu ya ushindani, hutokea kwamba
usemi wa kawaida unatafuta hadi herufi ya mwisho ya x,
na hivyo kukamata kisichohitajika.
Bila shaka, mara nyingi tabia kama hii ndio tunayohitaji. Lakini hasa katika kesi hii inahitajika kukataa ushindani na kuambia usemi wa kawaida, kwamba itafute hadi herufi ya kwanza ya x. Katika hili kesi inapaswa kuweka alama ya kuuliza baada ya operator wa kurudia:
res = re.sub('a.+?x', '!', txt)
print(res) # itatoka mstari '! zzz x kkk'
Ushindani unaweza kuzuiwa kwa waendeshaji wote
wa kurudia: *, ?, na
{} - kama hivi: *?, ??
na {}?.
Umeshapata mstari:
txt = 'aba accca azzza wwwwa'
Andika usemi wa kawaida, utakayopata
mistari yote ambayo pande zake zimo herufi
'a', na ubadilishe kila moja kwa
'!'. Kati ya herufi 'a' zinaweza kuwa
herufi yoyote (isipokuwa 'a').