Shikimi Pozitiv dhe Negativ në Shprehjet e Rregullta të Python
Ndonjëherë duhet të zgjidhet një detyrë e këtij lloji:
gjeni vargun 'aaa' dhe zëvendësojeni atë
me '!', por vetëm nëse pas
'aaa' ndodhet 'x', ndërsa
vetë 'x' nuk zëvendësohet. Nëse përpiqemi
të zgjidhim detyrën 'drejt e përpara',
nuk do të dalë mirë:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # do të shfaqë '! baaa', por ne donim '!x baaa'
Shikimi Përpara
Për të zgjidhur detyrën nevojitet një mënyrë për të thënë
që 'x' nuk duhet të zëvendësohet. Kjo bëhet
duke përdorur kllapat speciale (?= ),
të cilat thjesht shikojnë, por nuk e marrin me
vete.
Këto kllapa quhen shikim pozitiv përpara. Pozitiv - sepse 'x'
(në rastin tonë) duhet të jetë i pranishëm - vetëm atëherë
do të ndodhë zëvendësimi.
Le t'i përdorim këto kllapa për të zgjidhur detyrën tonë:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # do të shfaqë '!x aaab
Ekziston edhe shikim negativ përpara
- (?! ) - ai, përkundrazi, thotë
që diçka nuk duhet të jetë e pranishme. Në shembullin vijues,
zëvendësimi do të ndodhë vetëm nëse
pas 'aaa' nuk ndodhet 'x':
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # do të shfaqë 'aaax !b'
Shikimi Prapa
Në mënyrë të ngjashme ekziston shikim pozitiv
prapa - (?<= ). Në
shembullin vijues zëvendësimi do të ndodhë vetëm
nëse para 'aaa' ndodhet 'x':
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # do të shfaqë 'x!'
Ekziston gjithashtu shikim negativ prapa
- (?<! ). Në shembullin vijues
zëvendësimi do të ndodhë vetëm nëse para
'aaa' nuk ndodhet 'x':
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # do të shfaqë 'b!'
Detyra Praktike
Është dhënë një varg që përmban emra funksionesh:
txt = 'func1() func2() func3()'
Merrni një varg (array) me emrat e funksioneve nga vargu.
Është dhënë një varg me një tag:
txt = '<a href="" class="eee" id="zzz">'
Merrni një varg (array) me emrat e atributeve të këtij tagu.
Është dhënë një varg me variabla:
txt = '$aaa $bbb $ccc xxxx'
Merrni nënvargjet, para të cilave ndodhet shenja e dollarit.