Python’da Düzenli İfadeler (Regex): Metin İçinde Desen Aramak

Elinizde binlerce satırlık bir metin var ve içindeki tüm e-posta adreslerini bulmanız gerekiyor. Ya da bir kullanıcının girdiği telefon numarasının doğru formatta olup olmadığını kontrol etmeniz lazım. if ve string metotlarıyla bu işi yapmaya çalışırsanız, düzinelerce satır kod yazmanız gerekebilir. İşte tam bu noktada devreye giren araç: düzenli ifadeler (regular expressions, kısaca regex).

Regex Aslında Ne İşe Yarar?

Regex, bir metin içinde belirli bir “deseni” (pattern) tanımlamanızı ve bu deseni arama, eşleştirme, değiştirme gibi işlemlerde kullanmanızı sağlayan özel bir yazım dili. String metotları yazımızda str.find() ya da str.replace() gibi yöntemlerin sabit, değişmeyen bir metni aradığını görmüştük. Regex ise “üç haneli bir alan kodu, ardından tire, ardından yedi rakam” gibi esnek, kural tabanlı bir desen tanımlamanıza izin veriyor.

Python’da Regex: re Modülü

Python’da düzenli ifadelerle çalışmak için yerleşik re modülünü kullanıyoruz:

python

import re

metin = "İletişim için: ayse@ornek.com ya da mehmet123@site.com.tr adreslerinden ulaşabilirsiniz."
desen = r"[\w.-]+@[\w.-]+\.\w+"

eslesmeler = re.findall(desen, metin)
print(eslesmeler)
# ['ayse@ornek.com', 'mehmet123@site.com.tr']

Burada r"..." ile yazılan “ham string” (raw string) kullanımı önemli — regex’te ters eğik çizgi (\) çok sık kullanıldığından, Python’un bunu bir kaçış karakteri olarak yorumlamasını önlemek için r öneki ekleniyor.

En Sık Kullanılan Birkaç Sembol

Regex’in gücü, birkaç temel sembolü kombinleyebilmenizden geliyor: \d bir rakamı, \w bir harf/rakam/alt çizgiyi, \s bir boşluk karakterini temsil ediyor. + işareti “bir ya da daha fazla”, * işareti “sıfır ya da daha fazla”, ? ise “opsiyonel” anlamına geliyor. Örneğin \d{3}-\d{4} deseni, “üç rakam, tire, dört rakam” formatındaki (örneğin bir telefon numarası parçası) bir metni arıyor.

findall, search, match ve sub

re modülünün en sık kullanılan dört fonksiyonu farklı ihtiyaçlara cevap veriyor: re.findall() metindeki tüm eşleşmeleri bir liste olarak döndürüyor, re.search() ilk eşleşmeyi buluyor, re.match() sadece metnin başında bir eşleşme arıyor, re.sub() ise eşleşen kısımları başka bir metinle değiştirmeye yarıyor — örneğin bir metindeki tüm telefon numaralarını *** ile maskelemek için idealdir.

Ne Zaman Regex Kullanmamalı?

Regex güçlü ama her zaman en doğru araç değil. Basit bir “bu kelime metinde geçiyor mu?” sorusu için "kelime" in metin yazmak, gereksiz yere karmaşık bir regex desenine göre hem daha hızlı hem daha okunaklı. Regex’i, gerçekten esnek bir desen aramanız gerektiğinde (e-posta, telefon, tarih formatı, URL doğrulama gibi) saklamak en doğrusu.

Sonuç

Düzenli ifadeler, ilk bakışta şifreli görünen ama alıştıkça inanılmaz zaman kazandıran bir araç. Veri temizleme, form doğrulama ve metin işleme gibi neredeyse her gerçek dünya projesinde karşınıza çıkacak.

Yorum yapın