Ana içeriğe geç
Modül 8 · Ders 4 ders 4Kurstaki 32/36~12 min
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:

Python
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

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

Bulunursa Match nesnesini, aksi halde None nesnesini döndürür. Deyimsel kalıp:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: yalnızca dizenin başında

Python
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

Python
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ı:

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: oyuncu değişikliği

Python
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):

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

Adlandırılmış gruplar

Python
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

Python
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 too

Bellek 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

Egzersiz#python.m8.l4.e1
Denemeler: 0Yükleniyor…

'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.

Düzenleyici yükleniyor…
İ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

Egzersiz#python.m8.l4.e2
Denemeler: 0Yükleniyor…

`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.

Düzenleyici yükleniyor…
İpucu göster

re.sub(r"\\d+-\\d+", "XXX", s)

3 denemeden sonra çözüm mevcut

Ek zorluk

Egzersiz#python.m8.l4.e3
Denemeler: 0Yükleniyor…

\`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.

Düzenleyici yükleniyor…
İ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