21 Ocak 2013 Pazartesi

Düzenli İfadeler - 5



$ (Dolar)
Bir Önceki derste gördüğümüz ^(şapka) metakarakterinin ilk özelliğinin ters işlevine sahiptir.
Yani ^(şapka), karakter arama işlemini karakter topluluğunun başında yapıyordu, $(dolar)'da ise
aranacak karakter topluluğunun sonunda arama yapıyor.
Örnek verelim:

1.Örnek

>>> import re
>>> y=['deneme','söyleme','kaleme','makine','toplantı','kaşıntı','mırıntı']
>>> for i in y:
if re.search('me$',i):
print i


deneme
söyleme
kaleme

2.Örnek

>>> for i in y:
if re.search('e$',i):
print i


deneme
söyleme
kaleme
makine

3.Örnek

>>> for i in y:
if re.search('tı$',i):
print i


toplantı
kaşıntı
mırıntı


import re ile re kütüphanemizi eklemiş olduk.
1.örnekte sonu "me" ile biten kelimeleri buldurduk.
2.örnekte is sonu "e" ile biten kelimeleri buldurduk.
3.örnekte ise sonu "tı" ile biten kelimeleri buldurduk.


\ (Ters Bölme İşareti)
Bu metakarakter bildiğimiz kaçış dizisi ifadesidir.Bunu burada kullanmamızın sebebi ise özel karakterin
çıktısını alabilmek için.Örneğin az önceki konu olan $(dolar) işaretini el alalım.


>>>for i in liste:
if re.match('[0-9]+$',i):
print i

şeklinde bir kod yazarsek ekrana herhangi bir çıktı vermeyecek.Çünkü bizim sayı ile biten karakter dizisini
aradığımızı zannedecek, fakat bizim amacımız $(Dolar) fiyatlarını bulmak olduğu için yukarıdaki kodu
şöyle değiştiriyoruz:


>>> for i in liste:
if re.match('[0-9]+\$',i):
print i


10$
35$

Görüldüğü gibi istediğimiz sonuca ulaştık.

|(Dik Çizgi)
Bu metakarakterimizde birden falza düzenli ifadeyi eşleştirmemizde işimize yarıyor.Örneğin "de" ile başlayan ve "me" ile biten karakter dizilerini arayalım;


>>>y=['deneme','söyleme','kaleme','makine','toplantı','kaşıntı','mırıntı']
>>> for i in y:
if re.search('^de|me$',i):
print i


deneme
söyleme
kaleme

yada "ka" ile başlayan veya "ı" ile biten karakter dizilerini arayalım;


>>> for i in y:
if re.search('^ka|ı$',i):
print i


kaleme
toplantı
kaşıntı
mırıntı



ve son olarak bir örnek daha yaparak bu dersi sonlandıralım.

>>> import re
>>> import urllib
>>> url='http://www.pythondili.blogspot.com'
>>> f=urllib.urlopen(url)  //Bu kodu yazdıktan sonra biraz beklemeniz lazım çünkü programın siteye ulaşması biraz zaman(10sn) alıyor.
>>> for i in f:
nesne=re.search('.+',i)
if nesne:
print nesne.group()

Çıktı olarak "Python İle İp Bulma" yazımda verdiğim linki buldu: Kaynak


Bu son örneğimizde pythondili.blogspot.com içindeki yazıların içinde verilen linkleri aratmaktayız.
Bu kodun url='http://www.pythondili.blogspot.com' kısmını url='http://pythondili.blogspot.com/2013/01/duzenli-ifadeler-4.html' olarak değiştirdiğimizde sadece o yazı içerisinde link var mı yok mu kontrol eder.

20 Ocak 2013 Pazar

Düzenli İfadeler - 4


{} (küme parantezi)
Bu metakarakter sayesinde, istediğimiz bir karakteri istediğimiz kadar yineletmemizi sağlıyor.


>>>import re
>>> liste=['st','sat','saat,','zaaat',]
>>>for i in liste:
if re.match("sa{2}t",i):
print i

saat


ilk örneğimizde 2 a harfi olan saat kelimesini buldurduk.



>>> for i in liste:
if re.match("za{3}t",i):
print i


zaaat

bu örneğimizdede 3 a harfi olan zaat kelimesini bulduk

Bu metakarakterimizin diğer bir özelliğide {0,2} şeklinde yazarak en az ve en çok ne kadar
tekrar etmesini belirtebiliriz

>>> for i in liste:
if re.match("sa{0,2}t",i):
print i


st
sat
saat


aynı sonucu şu kodlarlada alabiliriz;


>>> for i in liste:
if re.match("sa*t",i):
print i


st
sat
saat

sonuç aynı fakat burada herhangi bir sınır olmadığı için saaaaaat kelimesini listeye eklediğimizde
bu kelimeyide çıktı verecektir.Bir önceki dersten hatırlayalım.

^ (Şapka)
Bu metakarakterimizin 2 özelliği var.Bunlar ilki bir karakter dizisini en başındaki verileri sorgulamak:

>>> x=['VC10DD','FF33GG','WW44EE','QQ11QQ']
>>> for i in x:
ara=re.search("^[A-Z]+[0-9]",i)
if ara:
print ara.group()


VC1
FF3
WW4
QQ1



İkincisi ise " hariç " anlamında kullanımı:

>>>x.appen('4fbPY91')
>>> for i in x:
ara=re.match("[0-9A-Z][^a-z]+",i)
if ara:
print ara.group()


VC10DD
FF33GG
WW44EE
QQ11QQ

gördüğünüz gibi burada sonrada eklediğimiz "4fbPY91" elemanını çıktıda vermedi.Çünkü biz match
metoduyla aranacak kriterleri şöyle belirledik:

[0-9A-Z]=aranacak değerin en başında bir sayı veya büyük harf olmalı şartı
[^a-z]=belirlediğimiz sayı veya büyük har şartından sonra ^(şapka) metakarakterimizin ikinci özelliği
olan haric tutma özelliği ile küçük harf olmaması şartını sağlıyor.
+ =Bu karakterimizde ise yukarıdaki küçük harf olayının tekrar etmesi şartını sağlıyor yani
sayı veya büyük harften sonra ne kadar küçük harf gelirse gelsin yinede bu karakter topluluğunu almayacak.

Bu ^(şapka) metakarakterimizin dahil etmeme özelliğini şöylede kullanabiliriz:

>>> for i in x:
ara=re.search("[0-9A-Z][^a-z]+",i)
if ara:
print ara.group()


VC10DD
FF33GG
WW44EE
QQ11QQ
PY91

Görüldüğü gibi burada "4fbPY91" elemanımızın başında sayı olmasına rağmen sonraki karakterler küçük harf
olduğu için ilk üç karakteri çıkararak sonr 4 karakteri bize verdi