Modül dersleri (4/4)
re modülü: Python'da regex
re modülü Python'daki düzenli ifadeleri kullanıma sunar. Zaten aldıysanız
Bu sitedeki Regex kursunda tüm söz dizimini tanıdık bulacaksınız; burada
API'lere bakıyoruz.
Ham dize: r"..."
Normal ifadeler birçok ters eğik çizgi kullanır (\d, \b, \s). Bunları her zaman şu şekilde yazın:
ham dizeler böylece onları iki katına çıkarmanıza gerek kalmaz:
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"re.search: ilk geçtiği yeri bul
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5Bulunursa Match nesnesini, aksi halde None nesnesini döndürür. Deyimsel kalıp:
if m := re.search(r"\d+", testo):
print(m.group())re.match: yalnızca dizenin başında
re.match(r"\d+", "42 anni") # match!
re.match(r"\d+", "ho 42 anni") # None (doesn't start with a digit)Herhangi bir yerde arama yapmak için re.search seçeneğini tercih edin.
re.findall: tüm oluşumlar
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']Desen yakalama grupları içeriyorsa, findall, grupları değil, grupları döndürür.
maçın tamamı:
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub: oyuncu değişikliği
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'Aynı zamanda bir değiştirme işleviyle de çalışır (Eşleşmeyi alan):
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'Adlandırılmış gruplar
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno") # '2025'
m.groupdict() # {'anno': '2025', 'mese': '01', 'giorno': '15'}Yararlı bayraklar
re.search(r"ciao", "CIAO", re.IGNORECASE) # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE) # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL) # . matches newline tooBellek güvenliği için re.finditer
Eşleşmeleri büyük bir metin bloğunda işlemeniz gerekiyorsa, re.findall, çıkarılan tüm eşleşme dizelerini içeren bir listeyi bellekte ayırır. Minimum bellek tüketen, Match nesnelerinin yavaş bir yineleyicisini sağlayan re.finditer() kullanılması tercih edilir.
Deneyin
'text =' ordine #123, totale €45.50, ricevuta #456'' verildiğinde, TÜM sipariş numaralarını (#'den sonraki rakamlar) bir dizi listesi olarak 'orders'a çıkarın. 'Siparişleri' değerlendirin.
İpucu göster
re.findall(r"#(\\d+)", text) — yalnızca rakamlar için yakalama grubu.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
`s = 'tel: 06-12345678 e tel: 02-9876'' verildiğinde, tüm telefon numaralarını (format \\d+-\\d+) 'XXX' dizesiyle değiştirin ve 'masked' olarak atayın. 'Maskeli'yi değerlendirin.
İpucu göster
re.sub(r"\\d+-\\d+", "XXX", s)
3 denemeden sonra çözüm mevcut
Ek zorluk
\`re\` modülünü içe aktarın. Bir veya daha fazla rakamdan oluşan tüm sayıları \`log_line = "15ms'de 404 hatası"\` dizesinden çıkarın. Listeyi \`sayılar\`da saklayın ve değerlendirin.
İpucu göster
Tüm sayıları bir dize listesi olarak çıkarmak için re.findall(r'\\d+', log_line) işlevini kullanın.
3 denemeden sonra çözüm mevcut