Düzenli İfadeler - compile
Cum 01 Eylül 2023compile() Fonksiyonu
Düzenli İfadelerin Derlenmesi
En başta da söylediğimiz gibi, düzenli ifadeler, karakter dizilerine göre biraz daha yavaş çalışırlar. Ancak düzenli ifadelerin işleyişini hızlandırmanın da bazı yolları vardır. Bu yollardan biri de compile() metodunu kullanmaktır.
Elimizde birden fazla arama yapılacak metin (örneğin metin1, metin2, ...) ve eşleşme için kullanacağımız bir tek desen varsa, findall(), finditer() gibi metotları kullanmak istediğimizde, python her seferinde deseni kendi anlayacağı biçimde derleyip sonra metin içinde arayacaktır. Kaç farklı eşleşme / arama yapılacak yapı (metin) varsa işlem o kadar uzun sürecektir.
compile kelimesi İngilizcede derlemek anlamına gelir. İşte biz de bu compile() metodu yardımıyla düzenli ifade desenlerimizi/kalıplarımızı kullanmadan önce derleyerek daha hızlı çalışmalarını sağlayacağız.
Küçük boyutlu projelerde compile() metodu pek hissedilir bir fark yaratmasa da özellikle büyük çaplı programlarda bu metodu kullanmak oldukça faydalı olacaktır.
Basit bir örnekle başlayalım:
import re
liste = ["Python2.7", "Python3.2", "Python3.3", "Python3.4", "Java"]
derli = re.compile(r"[A-Za-z]+[0-9]\.[0-9]")
for eleman in liste:
nesne = derli.search(eleman)
if nesne:
print(nesne.group())
Çıktı:
Python2.7
Python3.2
Python3.3
Python3.4
Burada öncelikle düzenli ifade desenimizi/kalıbımızı derledik. Derleme işlemini nasıl yaptığımıza dikkat edin.
Derlenecek düzenli ifade desenini compile() metodunda parantez içinde belirtiyoruz.
Daha sonra search() metodunu kullanırken ise, re.search() demek yerine, derli.search() şeklinde bir ifade kullanıyoruz. Ayrıca dikkat ederseniz derli.search() kullanımında parantez içinde sadece eşleşecek karakter dizisini (eleman) kullandık.
Eğer derleme işlemi yapmamış olsaydık, hem bu karakter dizisini, hem de düzenli ifade kalıbını yan yana kullanmamız gerekecektir .search("[A-Za-z]+[0-9].[0-9], eleman)". Ama düzenli ifade desenimizi yukarıda derleme işlemi esnasında belirttiğimiz için, bu kalıbı ikinci kez yazmamıza gerek kalmadı.
Ayrıca burada kullandığımız düzenli ifade desenine de dikkat edin. Nasıl bir şablon oturttuğumuzu anlamaya çalışın. Gördüğünüz gibi, liste öğelerinde bulunan . işaretini eşleştirmek için düzenli ifade kalıbı içinde \. ifadesini kullandık. Çünkü bildiğiniz gibi, tek başına . işaretinin re modülü açısından özel bir anlamı var. Dolayısıyla bu özel anlamdan kaçmak için \ karakterini de kullanmamız gerekiyor.
Detaylandıralım;
re.compile()fonksiyonu, düzenli ifade desenini derler ve birre.RegexObject nesnesi döner. Bu nesne, derlenmiş düzenli ifadeyi temsil eder ve aynı deseni birden çok kez kullanmak için daha verimli bir yol sunar.
İşte re.compile() fonksiyonunun temel amacı ve avantajları:
Performans Artışı:
Düzenli ifade desenleri büyük ve karmaşık olabilir. Bu desenleri her seferinde derleyip kullanmak yerine, re.compile() ile derlenmiş bir nesne oluşturabilir ve bu nesneyi kullanarak performans avantajı elde edebiliriz. Derleme işlemi, desenin daha hızlı eşleşmesine ve işlenmesine olanak tanır.
Örneğin:
import re
pattern = re.compile(r'\b\w+\b')
result = pattern.findall("Python is powerful")
Tekrar Kullanım Kolaylığı:
Derlenmiş bir düzenli ifade nesnesi oluşturduktan sonra, aynı deseni farklı metinler üzerinde birden çok kez kullanabilirsiniz. Bu, aynı deseni defalarca yazmak ve kodu çalıştırdıktan sonra her seferinde python tarafından derlemekten daha hızlı, temiz ve okunabilirlik sağlar.
Örneğin:
import re
pattern = re.compile(r'\b\w+\b')
result1 = pattern.findall("Python is powerful")
result2 = pattern.findall("Regular expressions are versatile")
Bayrakları Ayarlama:
re.compile() fonksiyonu, düzenli ifadenin derlenmesi sırasında bayrakları (flags) ayarlamanıza olanak tanır. (Bayraklar konusu ilgili sayfada detaylı olarak anlatılmaktadır.) Örneğin, re.IGNORECASE veya re.UNICODE bayraklarını belirleyerek deseni derleyebilirsiniz.
Örneğin:
import re
pattern = re.compile(r'\b\w+\b', re.IGNORECASE) # re.IGNORECASE bayrağı, küçük/büyük harf fark etmeksizin tüm kelimeleri döndürsün anlamına gelir.
result = pattern.findall("Python is case-insensitive")
print(result)
Çıktı:
['Python', 'is', 'case', 'insensitive']
Bu avantajlar, re.compile() fonksiyonunu kullanmanın genellikle tercih edilen bir yöntem haline getirir. Ancak, küçük uygulamalarda veya tek seferlik kullanımlarda re.compile() kullanmak zorunlu değildir.