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.

Hiç yorum yok:

Yorum Gönder