Aylık Arşiv: Şubat 2012

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

PHP’de sprintf ve printf Fonksiyonlarının Kullanımı

Python ile uğraşanların pek de yabancı olmayacakları iki PHP fonksiyonundan bahsedeceğim: sprintf ve printf.

sprintf ve printf fonksiyonları değişkenleri direkt string içinde yazmaktansa %s, %d gibi simgelerle kullanmamıza yarar. Örnek kodlara bakalım hemen…

<?php
$abc = "icerik";
echo "Yukarıdaki değişkenin değeri: $abc";
?>

Burada gördüğünüz basit bir echo yaptık. Bu işlemi sprintf ve printf kullanarak şöyle yapabilirdik:

<?php
$abc = "icerik";
printf("Yukarıdaki değişkenin değeri: %s", $abc);
?>

Bunu çalıştırdığınızda da aynı sonucu elde edeceksinizdir. Ama birinci kodda farklı olarak %s ile kullandık değişkeni.

Peki sprintf ile nasıl kullanacağız?

<?php
$abc = "icerik";
echo sprintf("Yukarıdaki değişkenin değeri: %s", $abc);
?>

Bakın yine aynı sonuç döndü. Ancak bu sefer printf’deki gibi direk kullanmadım, başına birde echo yazdım. Çünkü sprintf oluşturduğu stringi return eder. Ancak printf doğrudan çıktı verir.

Genelde sadece %s kullanılır ama bu fonksiyonlarda sadece %s yok. Daha birçok nitelik vardır. Bunlardan bazıları:
%e : Bilimsel gösterim
%d : Bir sayının, tam sayı kısmını verir
%+d : Bir sayının, tam sayı kısmının + ve – durumuna göre çıktı verir
%b : İkili düzene göre çıktı verir (1 ve 0)
%c : ASCII karakterleri yorumlar

Örnek bir kod:

<?php
$abc = 8768.989;
printf ("%%e: %e", $abc);
echo "\n";
printf ("%%d: %d", $abc);
echo "\n";
printf ("%%+d: %+d", $abc);
echo "\n";
printf ("%%b: %b", $abc);
echo "\n";
printf ("%%c: %c", "98");//98 küçük b'yi simgeler
echo "\n";
?>

Daha ayrıntılı bilgi için tıklayın.

 
77 Kudos
Don't move

PHP’de Konsoldan Argüman Kontrolü

Daha önce Bash’te Argüman Kontrolü‘nü anlatmıştım. Bu yazıda ise PHP’de argüman kontrolünü anlatacağım…

Uyarı: Bu anlattıklarım Linux’a göre anlatılmıştır. Windows’ta çalışıyor mu kontrol etmedim.

Argüman kontrolünde kullanacağımız iki tane indis var: $_SERVER[‘argv’] ve $_SERVER[‘argc’]

argv -> argument  values
argc -> argument  count

Örnek kod:

<?php
    echo "Gönderilen argümanlar: " . "\n";
    print_r ($_SERVER['argv']);
?>

Bu kodu deneme.php olarak kaydedin. Ardından

php deneme.php a b c

şeklinde bir komut verdiğinizde şöyle bir çıktı dönecektir:

Gönderilen argümanlar:
Array
(
 [0] => deneme.php
 [1] => a
 [2] => b
 [3] => c
)

Gördüğünüz gibi gönderdiğimiz argümanlar çıktı.

Peki kaç argüman olduğunu nasıl hesaplarız?

Bu işlemi count() ile de yapabiliriz. Ancak bunun için de ayrıca bir indis bulunuyor: $_SERVER[‘argc’]

Yukarıdaki kodu şöyle düzenleyelim:

<?php
    echo "Gönderilen argümanların sayısı: " . "\n";
    print_r ($_SERVER['argc']);
?>

Ardından tekrar:

php deneme.php a b c

Komutunu verince şöyle bir çıktı gelecektir:

Gönderilen argümanların sayısı:
4

3 argüman yollamamıza rağmen 4 yazmasının sebebi ise, php deneme.php a b c komutundaki deneme.php‘nin de gönderilen argümanlar arasından sayılmasından kaynaklanıyor.

 
10 Kudos
Don't move