19 Şubat 2012 Pazar

Düzenli İfadeler -2-

Metakarakterler
Bu başlık altında python'da metakarakter olarak adlandırılan []  .  *  +  ?  {}  ^  $  |  ()  \
bu karakterleri göreceğiz.Giriş olarak kısa bir örnek yapalım

>>> import re
>>> liste=["turgay","turgut","özkan","özcan","özhan","kemal","dündar"]
>>> for i in liste:
    nesne=re.search("öz[chk]an",i)
    if nesne:
        print (nesne.group())

özkan
özcan
özhan

şeklinde bir örnek ile [] işareti ile belli bir harf aralıklarını içeren isimleri bulduk.Şimdi
bun karakterlerini işleyelim.

[] Köşeli Parantez
Giriş kısmındada bağsettiğimiz gibi belli bir karakteri yada belli bir aralığı araştırır.

Şimdi önceki yazımda anlattığım match metoduyla bir örnek yapalım...

>>> import re
>>> x=["1php","2python","perl","java","3jquery","4css","c/c++"]
>>> for y in x:
    if re.match("[0-9]",y):
        print (y)

1php
2python
3jquery
4css

yaptığımız örnek,sayı ile başlayan karakter dizilerini match metoduyla bulmak.
Eğer istersek if re.match("[0-9]",y): ifadesini if re.match("[A-Z]",y): şeklinde değiştirerek
har ile başlayan karakter dizilerini ekrana yazdırabiliriz.Ama tabi bu büyük hat aramsı yapacağı için
bizim örneğimizde çalışacak şekli if re.match("[a-z]",y): şeklindedir.

. Nokta
Bu metakarakteri yeni satır karakteri dışındaki karakterlerin yerini tutar.

>>>liste=['sema', 'sena', 'sefa', 'semra', 'sene']
>>> for i in liste:
    if re.match("se.a",i):
        print(i)

sema
sena
sefa

yukarıdaki örnek bir dizi oluşturup,dizi için de "se" ile başlayıp "a" ile biteni veya devam edeni
bulmasını istedik.Burada .nokta m,n,f karakterlerinin yerini tutarak işlemi gerçekleştirdi.
Eğer şöyle bir örnek yaparsanız

>>> liste=["ahmet","mehmet","samet",]
>>> for i in liste:
    if re.match(".met",i):
        print(i)

şeklindeki örnek hiç bir çıktı vermeyecek.Çünkü ilk örnektede olduğu gibi bu metakarakter tek
karakterin yerini tutar.

* Yıldız
Bu metakarakter, kendisinden önce gelen bir ifade kalıbını 0 veya daha fazla karakterde eşleştirir.
Yani .nokta karakterinin çoğulu gibi düşünebiliriz.

>>> liste=["at","sat","saat","kat","tat","strafor"]
>>> liste.append("strafor")
>>> for i in liste:
    if re.match("sa*t",i):
        print (i)

sat
saat
strafor

Bu örnekte yaptığımızı açıklamak gerekirse,s ile başlayan karakter dizilerini bulmak diyebiliriz.
Burada s ile başlayıp a ile devam eden karakter dizilerini buldu.Ama strafor ne alaka diyebilirsiniz.
Tanımda da dediğimiz gibi 0 veya daha fazla eşleştirme yapar.

16 Şubat 2012 Perşembe

Düzenli İfadeler / Regular Experessions

Evet yeni bir konuya geçiş yapıyoruz.
Düzenli ifadeler her programlama dilinde oluduğu gibi pythonda da karşımıza çıkıyor.
Ama söylemeliyim ki python'nun belkide en karmaşık konusu.Ama elimden geldiğince basite indirgeyip
anlatmaya çalışacağım.Bu kadar konuşmadan sonra başlayalım...

Başlangıç olarak  re modülünü programa çağırmamız gerekiyor ki daha öncede yaptığımız gibi

>>>import re

Bunun arkasından dir(re) komutu ile kullanacağımız metodları ekrana yazdırabiliriz.
Gördüğünüz gibi biraz fazla.Tabiki hepsini anlatmayacağım ama bu anlatmayacaklarımın işinize
yaramayacağı anlamına gelmez.

Match() Metodu
Bu metod daha önce işlediğimiz split() ve startswith() metodlarıyla aynı işlevdedir.
Görevi ise bir karakter dizisi içinde bir kelime aramamızı sağlar fakat aradığımız kelime karakter
dizisinin başında olması gerekir.

>>> x="python dilini öğreniyorum"
>>> re.match("python",x)
<_sre.SRE_Match object at 0x0000000002D7C5E0>

Gördüğümüz gibi burada python kelimesi karakter dizimiz içinde var fakat python'nun bize döndürdüğü
mesaj pekde anlaşılır değil ama aradığımız kelimenin karakter dizisinin içinde varolduğunu söylüyor

Ama şunu yazarsak

>>> re.match("dilini",x)

herhangi bir çıktı ekrana gelmeyecektir.Aslında gelecektir fakat bunu görmek için kodun başına sadece
print ifadesini eklemek yeterli olacaktır.Peki karakter dizimizde "dilini" kelimesi var neden mesaj
vermedi derseniz match metdounun açıklama kısmının son cümlesine bakmanızı tavsiye ederim.

Split ve startswith ile aynı işlevde demiştik

>>> a.split()[0]=="python"
True
>>> a.split()[0]=="dilini"
False

>>> a.startswith("python")
True
>>> a.startswith("dilini")
False

Eğer amaç karakter dizisi başında bulunan bir kelimeyi bulmaksa Split ve startswith metodları kullanılmalıdır.
Çünkü Split ve startswith, match metodundan daha hızlıdırlar.

>>> y="abcdefg"
>>> re.match("abc")
<_sre.SRE_Match object at 0x0000000002E8C5E0>

>>> re.match("abcdef",y)
<_sre.SRE_Match object at 0x0000000002E8C648>

print (re.match("abcg",y))
none

Ama sitersek arattığımızda ne bulunduğunu da görebiliriz

>>> re.match("abcg",y)
>>> a="django,pythonnun çatısıdır"
>>> b=re.match("django",a)
>>> b.group()
'django'

Evet hemen bir programa yazalım

import re
x=input("Bir kelime giriniz: ")
y=re.match("python",x)
if y:
    print ("Kelimeniz (",y.group(),")ile başlıyor")
else:
    print ("Kelimeniz python ile başlamıyor")

bu programı yazıp masaüstünüze kaydedip deneyin ve siz de daha farklı programlar yazmayı deneyin ki
bu dersler dersler bir işe yarasın :)

Search() Metodu
Bu metod ile de karakter dizimizin tamammında arama yapabiliriz

>>>a="python dilinde en karışık konu düzenli ifadeler."
>>>re.search("ifadeler",a)
<_sre.SRE_Match object at 0x0000000002E2C648>

Bu kodla ilgili bir program yazarsak

import re
x=input("Bir cümle giriniz: ")
y=re.search("http://www.",x)
if y:
    print("cümlenizde internet adresi bulundu")
else:
    print("cümlenizde herhengi bir internet adresi yok")

Findall() Metodu
Bu metod ise yine search metodunun yaptığı işi yapar,ayrıca kelimenin karakter dizisi içinde
kaç tane olduğunu biz gösterir.

>>> import re
>>> z="Python'un son derece kolay okunabilir olması düşünülmüştür. Bu yüzden örneğin küme parantezleri yerine girintileme işlemi kullanılır. Hatta bazı durumlarda girintileme işlemine dahi gerek kalmadan kodun ilgili bölümü tek satırda yazılabilir. Böylece Python, program kodunuzu en az çaba ile ve hızlıca yazmanıza imkân tanır. Sade sözdizimi ile diğer programlama dillerinden üstündür."
>>> re.findall("python",z)
['Python', 'Python']

>>> c="Python programalama diline başlayalı çok olmadıki,pythonu sevmeye başladım"
>>> re.findall("python",c)
['python']

Yukarıda 2 tane örnek verdim.Fakat bunların ikisindede 2 tane python yazısı olamsına rağmen
birincisinde 2 tane python yazısı bul ikincisinde ise 1 tane.Bunun nedeni ise findall aranınlan
kelimeye tam olarak uyanı arar ve büyük küçük harf farkı bunu etkiler.

3 Şubat 2012 Cuma

Karakter Dizi Metodları-4

Partition metodu
Bu metod ile bir karakter dizisini belli bir ölçüte göre ayırabiliriz.

>>> a="bartın"
>>> a.partition("rt")
('ba', 'rt', 'ın')

>>> a.partition("b")
('', 'b', 'artın')

Eğer aratacağımız karakter, bizim karakter dizimiz içinde yok ise

>>> a.partition("P")
('bartın', '', '')

RPartition metodu
Partition metodu ile aynı görevde olup tek farkı Partition metodu soldan sağa RPartition metodu
ise sağdan sola doğru okuma yapar.

>>> a.rpartition("n")
('bartı', 'n', '')

Strip Metodu
Bu metod ise karakter dizimizin başında ve sonunda yer alan boşluk ve yeni satır gibi karakterleri
kaldırır.

>>> b="   Yönetim Bilişim Sistemleri   "
>>> b.strip()
'Yönetim Bilişim Sistemleri'

RStrip Metodu
Bu metod ise strip metodunun sağdece sonuna yani sağındaki boşluk ve yeni satır karakterleri kaldırır.

>>> b.rstrip()
'   Yönetim Bilişim Sistemleri'

LStrip Metodu
Bu metodda karakter dizimizin başında yani solundaki boşluk ve yeni satır karakterleri kaldırır.

>>> b.lstrip()
'Yönetim Bilişim Sistemleri   '

Splitlines Metodu
Bu metod ile karakter dizimizde yeni satır noktalarından itibaren keserek, bunları bir liste
haline çevirebilmemizi sağlıyor.

>>> c="Yönetim\nBilişim\nSistemleri"
>>> c.splitlines()
['Yönetim', 'Bilişim', 'Sistemleri']

Split Metodu
Bu metod join() metoduna benzemektedir.join() metoduyla bir listenin öğelerini karakter dizisi
şekline çeviriyorduk.Split() ie bu işlemin tam tersini yapıyor.

>>> f="Python programlama dili"
>>> f.split()
['Python', 'programlama', 'dili']

Bu şekilde ayırabildiği gibi

>>> f.split(",")
['Python programlama dili']

şeklindede birleştirebilir.
Diğer bir özelliği ise bir karakter dizisini kaç kez kesme işleminin uygulanmasını belirlememiz

>>> site="wwww.pythondili.blogspot.com"
>>> site.split(".",2)
['wwww', 'pythondili', 'blogspot.com']

görüldüğü gibi karakter dizimizdeki . alanlarından 2 tanesinde ayırma işlemi yaptı.Eğer
site.split(".",3) yapsaydık

>>> site.split(".",3)
['wwww', 'pythondili', 'blogspot', 'com']

eğer ayıracağımız karakter, bizim karakter dizimizde yok ise

>>> site.split(",",3)
['wwww.pythondili.blogspot.com']

ayırma işlemi yapmayacaktır.