Lompati ke konten utama
Modul 8 · Pelajaran 4 dari 432/36 dalam kursus~12 min
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:

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: temukan kemunculan pertama

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

Mengembalikan objek Match jika ditemukan, None jika ditemukan. Pola idiomatik:

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

re.match: hanya di awal string

Python
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

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

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

re.sub: pergantian pemain

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

Ia juga bekerja dengan fungsi pengganti (yang menerima Pertandingan):

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

Kelompok yang diberi nama

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

Bendera yang berguna

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

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

Latihan#python.m8.l4.e1
Upaya: 0Memuat…

Diberikan `text = 'ordine #123, totale €45.50, ricevuta #456'`, ekstrak SEMUA nomor pesanan (digit setelah #) ke dalam `orders` sebagai daftar string. Evaluasi `pesanan`.

Memuat editor…
Tunjukkan petunjuk

re.findall(r"#(\\d+)", text) — menangkap grup hanya untuk digit.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#python.m8.l4.e2
Upaya: 0Memuat…

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

Memuat editor…
Tunjukkan petunjuk

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

Solusi tersedia setelah 3 upaya

Tantangan tambahan

Latihan#python.m8.l4.e3
Upaya: 0Memuat…

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.

Memuat editor…
Tunjukkan petunjuk

Gunakan re.findall(r'\\d+', log_line) untuk mengekstrak semua angka sebagai daftar string.

Solusi tersedia setelah 3 upaya