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:

pythontxt = '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:

pythontxt = '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:

pythontxt = '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:

pythontxt = '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:

pythontxt = 'baaa'
res = re.sub('(?<!x)aaa', '!', txt)

print(res) # çap edəcək 'b!'

Praktik Məsələlər

Задание 1

Funksiya adlarını özündə cəmləşdirən sətir verilib:

pythontxt = 'func1() func2() func3()'

Sətirdən funksiya adlarının massivini əldə edin.

Задание 2

Teqli sətir verilib:

pythontxt = '<a href="" class="eee" id="zzz">'

Bu tegin atribut adlarının massivini əldə edin.

Задание 3

Dəyişənlər olan sətir verilib:

pythontxt = '$aaa $bbb $ccc xxxx'

Qarşısında dollar işarəsi olan alt sətirləri əldə edin.