Düzenli İfadeler (Regular Expressions)
Bütün programlama dillerinde yer edinmiş bir tanımdır. Bir düzenli ifade ile tanımlanan bir dizi özel karakterden oluşan bir kalıp sayesinde bir metin içerisinde çok karmaşık ya da çok basit aramalar, değiştirmeler yapabiliriz. Burada bazı kurallar ve özel bir söz dizimi vardır. Regex, düzenli ifadeler için kullanılan bir kısaltmadır, REGular EXpressions.
Bir programlama dilinde düzenli ifadeler oluşturmak için bazı özel karakterlerin tanımını bilmemiz gerekir. Bu kısım programlama dilinden bağımsız genel bir tanımdır.
Nokta (.) : Herhangi bir adet karakter yerine kullanılabilir.
Dolar ($) : Metnimizin sonunu tanımlamak için kullanılır.
Şapka (^) : Dolar işareti tersini yani metnimizin başlangıcını temsil eder.
Yıldız (*) : Öncesinde gelen ifadenin birden fazla kez de olsa tekrarlamalarını tanımlamak için kullanılır.
Köşeli parantez ([]) : İçerisine yazılan karakterler yerine kullanılabilir. İçerisinde tire işareti ile iki karakter birleştirilmiş ise, bir aralık belirtir.
Parantez () : Gruplandırarak aramamızı sağlar. Dönen sonuç buradaki gruplandırmaya göre olacaktır.
Pipe (|) : Veya anlamında iki ifadeyi birleştirebilir.
Artı (+) : Öncesindeki ifadenin bir veya daha fazla kez tekrar edeceğini tanımlarken kullanılır.
Soru İşareti (?) : Öncesindeki tanımın sıfır veya bir kez tekrar edeceğini ifade eder.
Süslü parantez ({}) : Yine tekrar sayısı için kullanılır fakat tamamen size kalmış bir sayıda tekrar için. {3}: üç tekrar, {4,7}: dört ile yedi arasında tekrar gibi.
Bu karakterlerin özel anlamları olduğundan eğer bu karakterin kendisini ifade etmek istiyorsak bunu ters bölü işareti ile kaçırmamız gerekir. Örneği soru işareti karakterini bir ifade içinde kendi anlamında kullanmak için \? şeklinde yazmalıyız.
Bunların dışında birden çok karakteri kapsayan özel tanımlar da mevcut.
\w : Harfleri eşleştirir
\W : Harf olmayan boşluk satır atlama gibi karakterleri eşleştirir
\s : Boşlukları eşleştirir. [\t\n\r\f] ile eş anlamlıdır.
\S : Boşluk anlamına gelmeyen karakterleri eşleştirir
\d : Rakamları eşleştirir. [0-9] ile eş anlamlıdır.
\D : Rakam olmayan karakterleri eşleştirir.
Düzenli bir ifade oluştururken kullanılabilecek bazı temel özel karakterleri listeledik. Python’da bunları nasıl kullanacağımıza gelirsek, bunun için Python içerisinde yerleşik gelen re modülünü kullanacağız.
# bu komut ile paketi kodumuza dahil edip # kullanamaya başlayabiliriz import re
Eşleştirme
Bu modül üzerinde match metodu ile hazırladığımız düzenli ifadeyi bir metine uygulayabiliriz. Daha sonra group metodu ile sonuca erişebiliriz. Match eğer bir eşleşme bulamazsa None dönecektir, bulursa match nesnesi dönecektir.
metin = "Elmalar kırmızı muzlar sarıdır" eslesme = re.match( '(.*)lar (.*?) .*', metin, re.I) if eslesme: print(eslesme.groups()) print("eslesme.group() : ", eslesme.group()) print("eslesme.group(1) : ", eslesme.group(1)) print("eslesme.group(2) : ", eslesme.group(2)) else: print("Eşleşme yok") # çıktımız şu şekilde olacak # ('Elma', 'kırmızı') # eslesme.group() : Elmalar kırmızı muzlar sarıdır # eslesme.group(1) : Elma # eslesme.group(2) : kırmızı
Yukarıdaki düzenli ifademiz şöyle işliyor. Öncelikle (.*) grubu ile
herhangi bir karakteri bir veya daha fazla kez tekrar edebileceğini söylüyoruz. Ta ki lar kelimesini görene kadar. Bunun sonrasında bir boşluk arıyor düzenli ifademiz, boşluğu da bulduktan sonra (.*?) grubuna geliyor. Burada da herhangi bir karakterin bir veya daha fazla geçtiği bir tanım var ve sonrasında bir soru işareti yani bu tanımı bir kez bulmalı ya da hiç bulmamalı. Soru işareti olmasaydı bu grup tanımından sonra gelen boşluğu bulacağı en son karaktere kadar(muzlar ) ilerleyecekti. Boşluğu da bulduktan sonra gelen .* tanımı ile herhangi bir karakteri defalarca kez eşleştirebilirsin diyoruz.
Burada match metoduna verilen üçüncü parametreye bayrak (flag) deniyor. Bazı seçenekleri buraya vereceğimiz değerler ile aktive edebiliriz. Bazı bayrak seçenekleri şöyle;
re.A: Sadece ASCII karakterleri eşler
re.I: Büyk-küçük harf hassasiyetini kaldırır
re.L: Yerelleştirme ayarlarını göz önüne alır
re.M: Çok satırlı eşleştirme yapar
re.S: Nokta özel karakterinin Yeni Satır karakterini de eşlemesini sağlar.
Diğer metotlara ve bayraklara şuradan ulaşabilirsiniz.
Arama
Search metodu ile yapılabilir. Match’ten farkı; baştan başlayarak bir eşleşme aramaz, yazdığımız düzenli ifadeyi tüm metin içerisine uygular.
Şu örneğe bakalım;
metin = "Elmalar kırmızı muzlar sarıdır" eslesme = re.match( '(muz)', metin, re.I) arama = re.search( '(muz)', metin, re.I) if eslesme: print(eslesme.groups()) else: print("Eşleşme yok") if arama: print(arama.groups()) else: print("Arama bulunamadı") # Dönüş bu şekilde olur # Eşleşme yok # ('muz',)
Eşleşme için verdiğimiz ifade metnimize uymadı çünkü match metodu metnin başından başlayarak bir kalıba yerleştirme yapmaya çalıştı.
Ama search metodu metnin tamamına baktı ve muz kalıbına uyan bir eşleşme bularak bunu döndürdü.
Arama ve Değiştirme
Bir metin içindeki bir ifadeyi düzenli bir ifade ile başka değerler ile değiştirmek de çok ihtiyaç duyulan bir işlemdir. RE modülü bu iş için sub(substitute) metoduna sahip.
metin = "Elmalar kırmızı muzlar sarıdır" degisim = re.sub( 'elma', 'kiraz', metin, flags=re.I) print(degisim) # kirazlar kırmızı muzlar sarıdır
Bazı yararlı kaynaklar;
Adım adım düzenli ifadeleri öğretmeyi amaçlayan kullanışlı bir site.
https://regexone.com/
Online olarak denemeler yapabileceğiniz bir site.
https://pythex.org/
Re modülü
https://docs.python.org/3/library/re.html
https://www.tutorialspoint.com/python/python_reg_expressions.htm
Düzenli ifadeleri anlatan Türkçe bir içerik
http://bidb.itu.edu.tr/seyirdefteri/blog/2013/09/08/d%C3%BCzenli-i-fadeler-(regular-expressions)
Bir cevap yazın