Pelajaran modul (4/4)
modul re: regex dengan Python
Modul re memaparkan ekspresi reguler dengan Python. Jika Anda sudah mengambil
kursus Regex di situs ini, Anda akan menemukan semua sintaks yang familier; di sini
kami melihat API.
String mentah: r"..."
Regex menggunakan banyak garis miring terbalik (\d, \b, \s). Selalu tuliskan sebagai
string mentah sehingga Anda tidak perlu menggandakannya:
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: temukan kemunculan pertama
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5Mengembalikan objek Match jika ditemukan, None jika ditemukan. Pola idiomatik:
if m := re.search(r"\d+", testo):
print(m.group())re.match: hanya di awal string
re.match(r"\d+", "42 anni") # match!
re.match(r"\d+", "ho 42 anni") # None (doesn't start with a digit)Untuk mencari di mana saja, pilih re.search.
re.findall: semua kejadian
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']Jika polanya memiliki grup tangkapan, findall akan mengembalikan grup, bukan
keseluruhan pertandingan:
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub: pergantian pemain
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'Ia juga bekerja dengan fungsi pengganti (yang menerima Pertandingan):
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'Kelompok yang diberi nama
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'}Bendera yang berguna
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 toore.finditer untuk keamanan memori
Jika Anda perlu memproses kecocokan dalam blok teks besar, re.findall mengalokasikan daftar di memori yang berisi semua string kecocokan yang diekstrak. Lebih disukai menggunakan re.finditer(), yang menghasilkan iterator malas objek Match, yang menghabiskan sedikit memori.
Cobalah
Diberikan `text = 'ordine #123, totale €45.50, ricevuta #456'`, ekstrak SEMUA nomor pesanan (digit setelah #) ke dalam `orders` sebagai daftar string. Evaluasi `pesanan`.
Tunjukkan petunjuk
re.findall(r"#(\\d+)", text) — menangkap grup hanya untuk digit.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Mengingat `s = 'tel: 06-12345678 dan tel: 02-9876'`, ganti semua nomor telepon (format \\d+-\\d+) dengan string 'XXX' dan tetapkan ke `masked`. Evaluasi `bertopeng`.
Tunjukkan petunjuk
re.sub(r"\\d+-\\d+", "XXX", s)
Solusi tersedia setelah 3 upaya
Tantangan tambahan
Impor modul \`re\`. Ekstrak semua angka yang terdiri dari satu digit atau lebih dari string \`log_line = "Error 404 in 15ms"\`. Simpan daftar di \`angka\` dan evaluasi.
Tunjukkan petunjuk
Gunakan re.findall(r'\\d+', log_line) untuk mengekstrak semua angka sebagai daftar string.
Solusi tersedia setelah 3 upaya