RegEx’de İleriye ve Geriye Bakma İşlemleri

Bu yazıda RegEx’de lookahead denilen ileriye bakmak ve lookbehind denilen geriye bakma işlemlerinden bahsetmek istiyorum.

İnternette örnek RegEx kodlarına baktıysanız eğer (?=abc)\w, (?<=abc)\w gibi RegEx pattern'larına (desen) rastlamışsınız muhtemelen. Peki bunlar ne anlama geliyor?

Bu tarz işlemlere lookahead ve lookbehind işlemleri diyoruz. Yukarıdaki örneklerde \w (word)’den önce abc terimi varsa bul dedik.

Tabii ki iş Regular Expression olunca bu kadarla bitmiyor :)

Look işlemleri 2’ye ayrılıyor demiştik: Lookahead ve Lookbehind.

Bu Lookahead ve Lookbehind’da kendi aralarında 2’ye ayrılır: Varsa ve yoksa

Şimdi birkaç örnek verelim:

Örnekler Python’a göre yapılmıştır. Ancak RegEx desenleri diğer dillerde de aynıdır. Eğer PHP’de kullanacaksanız, preg_match() kullanabilirsiniz.

Desenlerde kullanılan karakterlere bakalım…

Başında bu desen yoksa kontrolü: (?<!desen)desen
Başında bu desen varsa kontrolü: (?<=desen)desen Sonunda bu desen varsa kontrolü: desen(?=desen) Sonunda bu desen yoksa kontrolü: desen(?!desen) Biraz karışık görünmüş olabilir. Örneklere bakalım, daha iyi anlarsınız. Örnek string: a = [‘hedehodo’, ‘hodohede’, ‘ahodohedea’, ‘ahedehodo’, ‘hededeneme’, ‘denemehede’]

import re
a = ['hedehodo', 'hodohede', 'ahodohedea', 'ahedehodo', 'hededeneme', 'denemehede']

dd = re.compile('(?<!hede)hodo') #hodo'nun basinda hede olmayan stringleri bul.

for i in a:
    print "Aranan yer: %s" %i
    sonuc= dd.findall(i)
    print "Bulunan: %s" %sonuc

Şöyle bir çıktı olmalı:

Aranan yer: hedehodo
Bulunan: []
Aranan yer: hodohede
Bulunan: ['hodo']
Aranan yer: ahodohedea
Bulunan: ['hodo']
Aranan yer: ahedehodo
Bulunan: []
Aranan yer: hededeneme
Bulunan: []
Aranan yer: denemehede
Bulunan: []

Şimdi bir de bunun tam tersini yapalım. Yani yukarıdaki kodumuzdaki RegEx’i şöyle düzenleyelim:

dd = re.compile('(?<=hede)hodo') #hodo'nun basinda hede olan stringleri bul.

Şimdi çıktı şöyle oldu:

Aranan yer: hedehodo
Bulunan: ['hodo']
Aranan yer: hodohede
Bulunan: []
Aranan yer: ahodohedea
Bulunan: []
Aranan yer: ahedehodo
Bulunan: ['hodo']
Aranan yer: hededeneme
Bulunan: []
Aranan yer: denemehede
Bulunan: []

Şimdi bir de ileriye bakalım…

import re
a = ['hedehodo', 'hodohede', 'ahodohedea', 'ahedehodo', 'hededeneme', 'denemehede']
 
dd = re.compile('hede(?=hodo)') #hede'den hemen sonra hodo olan stringleri bul.
 
for i in a:
    print "Aranan yer: %s" %i
    sonuc= dd.findall(i)
    print "Bulunan: %s" %sonuc

Bunu çalıştırdığınızda:

Aranan yer: hedehodo
Bulunan: ['hede']
Aranan yer: hodohede
Bulunan: []
Aranan yer: ahodohedea
Bulunan: []
Aranan yer: ahedehodo
Bulunan: ['hede']
Aranan yer: hededeneme
Bulunan: []
Aranan yer: denemehede
Bulunan: []

şeklinde bir sonuç çıkacaktır…

Şimdi de son kodda ki RegEx’i şöyle düzenleyelim:

dd = re.compile('hede(?!hodo)') #hede'den hemen sonra hodo olmayan stringleri bul.

ve bununda çıktısı şöyle olacaktır:

Aranan yer: hedehodo
Bulunan: []
Aranan yer: hodohede
Bulunan: ['hede']
Aranan yer: ahodohedea
Bulunan: ['hede']
Aranan yer: ahedehodo
Bulunan: []
Aranan yer: hededeneme
Bulunan: ['hede']
Aranan yer: denemehede
Bulunan: ['hede']

Evet şu ana kadar bulunan sonuçlar hep parçalı geldi. Yani hede(?!hodo) şeklinde bir arama yaptıysak, hede’yi bulduk. Ya peki hedehodo’yu elde etmek istersek?

O zamanda : (iki nokta üst üste) işaretini kullanacağız…

Örneğin:

import re
a = ['hedehodo', 'hodohede', 'ahodohedea', 'ahedehodo', 'hededeneme', 'denemehede']

dd = re.compile('(?:hede)hodo') #hodo'nun basinda hede olan stringleri bul Parcalamadan bas.

for i in a:
    print "Aranan yer: %s" %i
    sonuc= dd.findall(i)
    print "Bulunan: %s" %sonuc

Bu kodun çıktısı şöyle olacaktır:

Aranan yer: hedehodo
Bulunan: ['hedehodo']
Aranan yer: hodohede
Bulunan: []
Aranan yer: ahodohedea
Bulunan: []
Aranan yer: ahedehodo
Bulunan: ['hedehodo']
Aranan yer: hededeneme
Bulunan: []
Aranan yer: denemehede
Bulunan: []
 
6 Kudos
Don't move
  1. Bu güzel yazıda “hedehodo” dan daha anlamlı, anlaşılır liste elemanı bulamadınız mı? Önemli bir konuya değinmiş ve iyide açıklamışsınız. Keşke örneklerde kullandığınız değerler de aynı kalitede olsaydı.

    • Adil İlhan

      @Vigo :), üstad yazıya yorum yapman dahi beni pek mutlu etti, fikrin için tekrar teşekkürler. O konuda haklısınız, en kısa sürede örnekleri tekrar düzenlemeye çalışacağım.

  2. bence hede hodo gibi değişik terimlerin kullanılması konunun, akılda kalıcılığını artırdı.Çok detaylı ve son derece açık bir dille anlatılmış.Ellerinize sağlık teşekkürler 😉

  3. Adil’im kardeşim bak kontrol ediyorum halen düzeltmemişsin hedehodoyu hahahahha :mrgreen: 😛

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>