Regex (regular expression) başlangıç rehberi

Regex (regular expression) başlangıç rehberi

Bu yazımızda regular expressions kavramından bahsederek, uygulamalı bir örneğe yer vereceğiz.
Hatice Dikmen07 Şub 2023

Bu yazımızda özetle bir çok durumda gereksinim duyabileceğiniz iş yapış süreçlerinizi önemli ölçüde etkileyebilecek bir içerikle devam ediyoruz: Düzenli ifadeler. 

  • Düzenli ifadeler nelerdir?
  • Neden düzenli ifadeleri öğrenmeliyiz?
  • Bilmeniz gereken temel Regex karakterleri konu başlıklarına değinerek örnekler ile Regex’i daha yakından inceleyeceğiz.

 

Regex (düzenli/kurallı ifadaler) nedir? 

Regex bir kütüphane veya bir programlama dili değil; herhangi bir metinde (dize) bir arama düzenini belirten bir karakter dizisidir. Bir metinden, harflerden, sayılardan, boşluk karakterlerinden veya özel karakterlerden, yani hemen hemen her şeyden oluşabilir. 

Metin bir tür desen izlediği sürece, regex bu deseni yakalayabilir ve metnin belirli bir bölümünü döndürmeye devam eder. Bir metin içerisindeki kalıpları (patterns) kullanarak esnek arama yapılabilmesine olanak tanır.

 

Büyük ölçekteki verilerin ayrıştırılması gerekiyorsa; Regex bilmek binlerce saat kazandırabilir!

 

Regex hemen hemen her programlama dilinde kullanılabilir. Ama Regex’in sahip olduğu syntax (söz dizimi) alışageldiklerimizden biraz daha farklıdır. Hemen bir örnekle açıklık getirecek olursak; aşağıda bir kredi kartını tanımlayan temel bir Regex kalıbı görülebilmekte:

"(\d{4} \d{4} \d{4} \d{4})|(\d{4}\-\d{4}\-\d{4}\-\d{4})|([1-9]\d{15})"

Bu regex kalıbı sizi korkutuyorsa endişelenmenize gerek yok! Bu yazıyı bitirdiğinizde ifadeyi kolaylıkla anlayacaksınız. 

 

Neden regex öğrenmeliyiz? 

  • Bir mail adresinin doğru formatta olup olmadığını test etmek,
  • Bir posta kodunun doğru sayıda rakam içirip içermediğini anlamak,
  • Bir yazı içinde tekrar etmiş kelimeleri bulmak, 
  • Bir klasör içindeki aynı dosya uzantılarına sahip dosyaları bulup, uzantılarını değiştirebilmek,
  • Dosya ismi içindeki tüm noktaları boşluğa çevirebilmek,
  • Favori metin editörünüzde kod aramak ve/veya yeniden düzenlemek,
  • Kullanıcı girişlerini doğrulayabilmek (input validations),
  • Efektif code refactoring  ve çok daha fazlasını yapmak için regex öğrenmek oldukça gereklidir.

 

Aynı regex kalıplarını tekrar tekrar yazmak yerine, bir kere oluşturduktan sonra (ya da başka biri tarafından hazırlanmış bir tanesini internet üzerinden bulup kullanarak) işlerinizi hızlandırabilir ve kolaylaştırabilirsiniz.

 

Bir kere öğren her yerde kullan!

 

Regex’in ne olduğundan ve ne için kullanıldığını öğrendikten sonra bilinmesi gereken temel Regex karakterlerini inceleyelim. Asıl konuya girmeden önce, düzenli ifadelerin bazı temel özelliklerini gözden geçirelim:

 

Karakterler

Escaping (kaçış): Regex’in içinde özel karakterlerin yer aldığı bir sembol kümesi vardır. Bu karakterler metinlerde de kullanığımız [ ] ? % + ^ gibi semboller olabilmektedir. Bu semboller metinde Regex mi belirtip belirtmediği ya da metnin kendi içinde mi yer aldığını ayırt etmek önemlidir. Aksi takdirde istenilen sonuç elde edilemeyebilir. Bu nedenle escaping karakter denilen \ (ters bölü işareti) kullanılmaktadır.

Aşağıda regex söz dizimi (syntax) içerisinde kullanılan özel karakterlerdir görülebilmektedir:

  • “+” Bir önündeki ifadenin en az 1 defa ve daha fazla yakalanmasını sağlar. Önemli olan kısım en az bir defa çalışmalıdır.
  • - Aralık belirtmede kullanılır.
  • “*” Bir önündeki ifadenin 0 ve daha fazla yakalanmasını sağlar. Hiç çalışmasa da pattern bozulmaz, devam eder.
  • “[ ]” Liste oluşturur. Listenin içindeki ifadeleri yakalar.
  • “[^]” Tersi, negatifi anlamındadır. Listenin içindeki ifadeler hariç diğer her şeyi yakalar.
  • “.” Yeni satır hariç bütün karakterleri yakalar.
  • “{x, y}” Bir önündeki ifadenin en az ve en çok kaç defa yakalanacağını ifade eder {en az=x , en çok=y}
  • (?<=) Positive lookbehind, eşittir işaretinden sonra hangi karakter yada kelimeyi yazarsanız, oraya kadar yakalar ve imleci son karakterin sağ tarafına getirir. 
  • “?” Opsiyonel (0 veya 1 kez tekrarlı) kullanım.
  • “$” Satır sonu. Metin bitiş kuralı.
  • “|”  Veya, önceki koşul yada sonraki koşuldan birisini çalıştırırsa devam eder.

 

Yazılmayan karakterler ise şöyledir:

  • “\n” satır sonu (new line)
  • “\r” satır kesme (break)
  • “\t” sekme boşluk (tab)
  • “\b” kelime sınırı (word boundary)

 

Kısa tanımlara bakacak olursak:

  • “\w” a’dan z’ye, A’dan Z’ye, 0123456789, _ karakterlerini yakalar, [ a-zA-Z0-9_ ].
  • “\W” a’dan z’ye, A’dan Z’ye, 0123456789, _ karakterleri hariç diğer karakterleri yakalar.

Görsel kaynağı

 

  • “\s” Boşluk, tab ve yeni satır karakterlerini yakalar, [space\t\r\n].
  • “\S” Boşluk, tab ve yeni satır karakterleri hariç yakalar, [^space\t\r\n].

Görsel kaynağı

 

  • “\d” Rakamları yakalar [0-9].

Görsel kaynağı

 

  • “\D” Rakam olmayanları yakalar, [^0-9].
  • “[\d\D]” Digit yada digit olmayan yani noktanın yakalayamadığı yeni satır karakterini de yakalar.


 

Yukarıda verilen örnekleri online olarak test etmek isterseniz regex101 adlı siteye göz atabilirsiniz.

 

Regex hakkında genel bilgileri verdikten sonra örnekler ile devam edelim.

İlk olarak kaggle’dan edindiğimiz veri setimizi PyCharm’da miuul-regex isimli bir klasör oluşturup içine ekleyelim. Ben bu örnekte banka pazarlama veri seti olan bank.csv dosyasını kullanacağım.

Banka müşteri verilerinde yaş (sayısal),  iş türü,  medeni durum, eğitim, temerrüt, konut, kredi, iletişim türü, ay, haftanın günü, süre, kampanya, pdays, poutcome, cons.price.idx, cons.conf.idx, euribor3m, çalışan sayısı gibi değişkenler bulunmaktadır. Biz bu değişkenlerden yaş, iş türü ve eğitim değişkenlerinden regex ile yeni bir csv dosyasına aktaracağız.

Adım 1:  İlk olarak işlem yapacağımız veri setinden veri örneğimizi alıyoruz, regex.101 sitesine giderek verimizi yapıştırıp regex komutlarıyla alt metinlerimizi oluşturuyoruz. 

 

 

Adım 2: Code generator kısmından kod dosyamızı kopyalıyoruz.

 

Adım 3: PyCharm’ı açarak bank.py adında bir PyCharm dosyası oluşturup kodlarımızı yapıştırıyoruz.

 

Adım 4: bank_linebyline.py dosyamızda 3. satırdaki regex kısmına regex kodumuzu yazıyoruz.

 

Adım 5: Artık kodumuz hazır olduğuna göre kodumuzu çalıştırabiliririz. Kodumuzun çıktılarını Python konsoldan görebilmekteyiz.

 

Adım 6: Çektiğimiz verilerin new_bank.csv dosyasında oluştuğunu göreceksiniz.


 

Bu örneğimiz buraya kadardı. Şimdi sık kullanılan bazı regex komutlarına örnek verelim.

1. Telefon numarası: Aşağıdaki gibi telefon numaralarının bir listesini içeren, telefon adında bir verimizin olduğunu varsayalım.

 

Bu telefon numaralarını 3 ayrı bileşene ayırmak istiyoruz: Alan kodu (ilk 3 hane), santral (sonraki 3 hane) ve hat numarası (son 4 hane). Gördüğünüz gibi telefon numaralarının hepsi tutarlı değil, fakat endişlenmeye gerek yok. Regex kalıpları ile bu ifadeleri kolayca ayrıştırabiliriz.

Adım 1: İlk olarak regex kalıbını tanımlayalım.

 

Adım 2: Tanımladığımız Regex modelini kullanarak yakalama gruplarını almak ve bunları veri çerçevesindeki ayrı sütunlara koymak için str_match işlevini kullanabiliriz.

 

 

2. Tarih: Tutarsız sınırlayıcılara sahip tarihlerden oluşan;  günleri, ayları ve yılları çıkarmak istediğimiz tarih adında başka bir veri değişkenimiz olduğunu düşünelim.

 

 

 İlk olarak, tarihler Regex modelini tanımlayalım:

"(\d{2}).(\d{2}).(\d{4})"gm
 

 

Artık kalıbı eşleştirebilir; gün, ay ve yıl için ayrı sütunlar oluşturabiliriz.

 

 

Örneklerimiz buraya kadardı. Bu örnekleri isim, url, email adresi gibi bir çok şekilde çeşitlendirebiliriz. 

 

Bu yazımızda sizlere regex hakkında bilgiler verdik. Regex’in tanımından ve neden ögrenmemiz gerektiğine değindik. Bunları yaparken, Regex komutları ile birkaç uygulamalı örneğe de yer verdik. Faydalı olması dileği ile.

 

Kaynaklar

Miuul topluluğunun bir parçası ol!

Abone ol butonuna tıklayarak Miuul'dan pazarlama ve haber içerikleri almayı onaylıyorum.