Python Regular İfadələrində Müsbət və Mənfi Qabaqcadan Baxış
Bəzən bu tip məsələni həll etmək lazım gəlir:
'aaa' sətirini tapın və onu
'!' ilə əvəz edin, ancaq əgər
'aaa'-dan sonra 'x' gəlirsə, özü
'x' isə əvəz edilməməlidir. Əgər biz
məsələni 'birbaşa' həll etməyə çalışsaq,
heç nə alınmayacaq:
txt = 'aaax baaa'
res = re.sub('aaax', '!', txt)
print(res) # çap edəcək '! baaa', istədiyimiz isə '!x baaa' idi
Qabaqcadan Baxış
Məsələni həll etmək üçün bir üsul lazımdır ki,
'x'-in əvəz edilməməli olduğunu göstərsin. Bu,
xüsusi mötərizələr (?= ) ilə edilir,
onlar sadəcə baxır, lakin özləri ilə götürmürlər.
Bu mötərizələr müsbət qabaqcadan baxış adlanır.
Müsbət - çünki 'x'
(bizim vəziyyətimizdə) olmalıdır - yalnız o zaman
əvəzetmə baş verəcək.
Gəlin bu mötərizələri məsələmizi həll etmək üçün tətbiq edək:
txt = 'aaax baaa'
res = re.sub('aaa(?=x)', '!', txt)
print(res) # çap edəcək '!x aaab
Mənfi qabaqcadan baxış da var
- (?! ) - o, əksinə, deyir ki,
bir şey olmamalıdır. Aşağıdakı
nümunədə, əvəzetmə yalnız o zaman baş verəcək ki,
'aaa'-dan sonra 'x' OLMASIN:
txt = 'aaax aaab'
res = re.sub('aaa(?!x)', '!', txt)
print(res) # çap edəcək 'aaax !b'
Geriyə Baxış
Eyni qaydada müsbət
geriyə baxış da var - (?<= ).
Aşağıdakı nümunədə əvəzetmə yalnız o zaman baş verəcək ki,
'aaa'-dan əvvəl 'x' olsun:
txt = 'xaaa'
res = re.sub('(?<=x)aaa', '!', txt)
print(res) # çap edəcək 'x!'
Həmçinin mənfi geriyə baxış da var
- (?<! ). Aşağıdakı nümunədə
əvəzetmə yalnız o zaman baş verəcək ki,
'aaa'-dan əvvəl 'x' OLMASIN:
txt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)
print(res) # çap edəcək 'b!'
Praktik Məsələlər
Funksiya adlarını özündə cəmləşdirən sətir verilib:
txt = 'func1() func2() func3()'
Sətirdən funksiya adlarının massivini əldə edin.
Teqli sətir verilib:
txt = '<a href="" class="eee" id="zzz">'
Bu tegin atribut adlarının massivini əldə edin.
Dəyişənlər olan sətir verilib:
txt = '$aaa $bbb $ccc xxxx'
Qarşısında dollar işarəsi olan alt sətirləri əldə edin.