Python'da Düzenli İfadeler

Python'da Düzenli İfadeler

Bu makale, Python'daki düzenli ifadeleri açıklar.

re modülünün temel kullanımından karmaşık düzenli ifade desen eşleştirmeye kadar geniş bir yelpazeye değineceğiz.

YouTube Video

Python'da Düzenli İfadeler

re modülü, düzenli ifadeler kullanarak metinlerde arama yapmak ve onları işlemek için kullanılır.

re modülü nedir?

re modülü, Python'un standart kütüphanesine dahildir ve düzenli ifadeler kullanarak metin üzerinde işlem yapmak için işlevsellik sağlar. Düzenli ifadeler, belirli metin desenlerini verimli bir şekilde bulmak, çıkarmak veya değiştirmek için kullanılır.

Temel Düzenli İfade Desenleri

Düzenli ifadeler, özel semboller kullanarak desenleri tanımlar. Aşağıda bazı temel desenler bulunmaktadır.

  • .: Herhangi bir tek karakter
  • ^: Bir dizenin başlangıcı
  • $: Bir dizenin sonu
  • \d: Herhangi bir rakam (0-9)
  • \w: Herhangi bir kelime karakteri (a-z, A-Z, 0-9, _)
  • \s: Herhangi bir boşluk karakteri
  • *: Sıfır veya daha fazla tekrar
  • +: Bir veya daha fazla tekrar
  • []: Karakter sınıfı (ör., [a-z] küçük harfleri eşleştirir)
 1import re
 2
 3pattern = r"\d{3}-\d{4}"
 4text = "My postal code is 123-4567."
 5result = re.search(pattern, text)
 6if result:
 7    print(result.group())  # Output: 123-4567
 8
 9# Define a pattern using basic regular expression symbols
10pattern = r"^\w+\s\d+\s[a-zA-Z]+$"
11
12# Example text to test the pattern
13text = "Room 23 Tokyo"
14
15# Check if the pattern matches the text
16result = re.match(pattern, text)
17if result:
18    print("Matched:", result.group())
19else:
20    print("No match")
  • Bu kod önce dizgenin bir posta kodu desenine uyup uymadığını kontrol eder. Ardından, tüm dizgenin (baştan sona) bir kelime, boşluk, rakamlar, boşluk ve İngilizce bir kelimeden oluşan bir desene uyup uymadığını kontrol eder. Bu, düzenli ifadelerin temel öğelerinin nasıl birleştirilebileceğini anlamanıza yardımcı olur.

Eşleşen Fonksiyonların Nasıl Kullanılacağı

re.match()

re.match(), bir dizenin başlangıcının belirtilen desenle eşleşip eşleşmediğini kontrol eder.

1import re
2
3pattern = r"\w+"
4text = "Python is powerful"
5match = re.match(pattern, text)
6if match:
7    print(match.group())  # Output: Python
  • Bu kod, dizgenin bir kelime karakteriyle (alfanümerik veya alt çizgi) başlayıp başlamadığını kontrol eder. İlk kelime 'Python' desene uyar ve çıktı olarak verilir.

re.search()

re.search() tüm metni tarar ve ilk eşleşmeyi döndürür.

1import re
2
3pattern = r"powerful"
4text = "Python is powerful and versatile"
5search = re.search(pattern, text)
6if search:
7    print(search.group())  # Output: powerful
  • Bu kod, tüm dizgede 'powerful' kelimesini arar ve ilk eşleşmeyi döndürür. Sonuç olarak, re.search() eşleşen 'powerful' dizgesini döndürür.

re.findall()

re.findall() desene uyan tüm eşleşmeleri bir liste olarak döndürür.

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.findall(pattern, text)
6print(matches)  # Output: ['Python', 'strong']
  • Bu kod, tam olarak altı karakter uzunluğundaki tüm kelimeleri bulur ve bunları bir liste olarak döndürür. Dizgedeki 'Python' bu koşulu sağlar ve ['Python'] listesi döndürülür.

re.finditer()

re.finditer() tüm eşleşmeleri bir iterator olarak döndürür ve her bir eşleşme için ayrıntılı bilgi elde etmenizi sağlar.

1import re
2
3pattern = r"\b\w{6}\b"
4text = "Python is powerful and versatile"
5matches = re.finditer(pattern, text)
6for match in matches:
7    print(match.group())  # Output: Python
  • Bu kod, altı harfli tüm kelimeleri sırayla arar ve her eşleşmeyi bir yineleyici aracılığıyla işler. Burada 'Python' desene uyar ve çıktı olarak verilir.

Değiştirme ve Bölme

re.sub()

re.sub() düzenli ifadeye uyan metin kısımlarını başka bir metinle değiştirir.

1import re
2
3pattern = r"\d+"
4text = "There are 100 apples"
5new_text = re.sub(pattern, "many", text)
6print(new_text)  # Output: There are many apples
  • Bu kod, dizgedeki tüm rakamları 'many' ile değiştirir.

re.split()

re.split() düzenli ifadeye uyan kısımlarda metni böler.

1import re
2
3pattern = r"\s+"
4text = "Python is powerful"
5parts = re.split(pattern, text)
6print(parts)  # Output: ['Python', 'is', 'powerful']
  • Bu kod, dizgeyi bir veya daha fazla boşluk karakterine göre böler. Sonuç olarak, dizge kelimelere ayrılır ve ['Python', 'is', 'powerful'] elde edilir.

Gruplar ve Yakalamalar

Düzenli ifade gruplamayı kullanmak, eşleşen alt dizgeleri çıkarmayı kolaylaştırır. Parantez () içine almak, onu bir grup olarak yakalar.

1import re
2
3pattern = r"(\d{3})-(\d{4})"
4text = "My postal code is 123-4567."
5match = re.search(pattern, text)
6if match:
7    print(match.group(1))  # Output: 123
8    print(match.group(2))  # Output: 4567
  • Bu kod, '123-4567' biçimindeki bir posta kodundan 3 basamaklı ve 4 basamaklı sayıları ayrı gruplar olarak çıkarır. group(1) ilk üç basamağı '123' döndürür ve group(2) son dört basamağı '4567' döndürür.

Adlandırılmış gruplar

Adlandırılmış grupları kullanmak, indekslere güvenmek yerine değerleri anlamlı adlarla almanıza olanak tanır. Aşağıda, bir günlükten tarih ve seviyeyi çıkaran somut bir örnek verilmiştir.

1import re
2
3log = "2025-10-25 14:00:01 [ERROR] Something failed"
4
5pattern = r"(?P<date>\d{4}-\d{2}-\d{2}) (?P<time>\d{2}:\d{2}:\d{2}) \[(?P<level>[A-Z]+)\] (?P<msg>.*)"
6m = re.search(pattern, log)
7if m:
8    print(m.group("date"), m.group("time"), m.group("level"))
9    print("message:", m.group("msg"))
  • Bu kod, bir günlük dizgesinden tarih, saat, seviye ve mesajı çıkarmak için adlandırılmış gruplar kullanır. Değerleri indeksler yerine anlamlı adları kullanarak alır.

Bayrak Seçeneklerini Kullanma

re modülü, arama davranışını kontrol etmek için çeşitli bayrak seçeneklerine sahiptir.

  • re.IGNORECASE (re.I): Eşleşmeleri büyük/küçük harf duyarsız hale getiren bir bayrak seçeneği.
  • re.MULTILINE (re.M): Birden fazla satır arasında eşleşmeye olanak tanıyan bir bayrak seçeneği.
  • re.DOTALL (re.S): Nokta . karakterinin yeni satır karakterleriyle de eşleşmesini sağlayan bir bayrak seçeneği.
1import re
2
3pattern = r"python"
4text = "Python is powerful"
5match = re.search(pattern, text, re.IGNORECASE)
6if match:
7    print(match.group())  # Output: Python
  • Bu kod, 'python' kelimesini büyük/küçük harfe duyarsız şekilde arar. re.IGNORECASE bayrağı kullanıldığında, ayrıca 'Python' ile de eşleşir.

Düzenli ifade nesnelerinin (re.compile) avantajları

Bir deseni re.compile ile derlemek, yeniden kullanımı daha verimli hale getirir ve okunabilirliği artırır. Burada ayrıca bayraklar da ayarlayabilirsiniz.

Aşağıdaki örnek, derlenmiş bir desen kullanarak birden çok satırda eşleşmeleri tekrar tekrar arar. Aynı deseni sıkça kullanıyorsanız, onu re.compile ile derlemek performansı artırır.

1import re
2
3pattern = re.compile(r"User: (\w+), ID: (\d+)")
4text = "User: alice, ID: 1\nUser: bob, ID: 2"
5
6for m in pattern.finditer(text):
7    print(m.groups())
  • Bu kod, derlenmiş bir düzenli ifadeyi kullanarak birden çok satırdan kullanıcı adlarını ve kimlikleri (ID) çıkarır. re.compile, aynı deseni yeniden kullanırken verimliliği artırır ve ayrıca kodu daha okunabilir hale getirir.

Uygulamalar

Örneğin, bir metin dosyasından tüm e-posta adreslerini çıkaran bir betiği düşünün.

1import re
2
3pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
4text = "Contact us at info@example.com or support@service.com."
5emails = re.findall(pattern, text)
6print(emails)  # Output: ['info@example.com', 'support@service.com']
  • Bu kod, dizgedeki tüm e-posta adreslerini bulur ve bunları liste olarak döndürür.

Sonuç

re modülü, Python'da metin işleme için güçlü bir araçtır. Burada, temel kullanımdan gruplama ve bayrak seçeneklerini kullanarak ileri düzey düzenli ifadelere kadar geniş bir yelpazeyi ele aldık. Python'un düzenli ifadeleri çok güçlüdür ve metin işleme için vazgeçilmez bir araçtır.

Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.

YouTube Video