Tiga fungsi module re yang tampak serupa — re.search(), re.match(), dan re.fullmatch() — sering dipertukarkan sembarangan, dan kesalahannya senyap: program tetap berjalan, hanya menerima atau menolak teks yang salah. Chapter ini membedakan ketiganya dari syarat posisi pencocokan yang mereka tetapkan, lalu melengkapi peranti di sekelilingnya: isi object re.Match, perilaku findall(), iterator finditer(), dan pola hasil re.compile().
Tiga Posisi Pencocokan #
| Fungsi | Syarat posisi | Kegunaan khas |
|---|---|---|
re.match() | pencocokan harus dimulai di karakter pertama | memeriksa awalan string |
re.search() | boleh mulai di posisi mana pun, berhenti di kemunculan pertama | memeriksa kehadiran pola |
re.fullmatch() | pola harus menghabiskan seluruh string | validasi format penuh |
import re
teks = "Kode pesanan: INV-2025-4821"
print(re.match(r"Kode", teks))
print(re.match(r"INV", teks))
print(re.search(r"INV", teks))
print(re.fullmatch(r".+", teks))Output yang Dihasilkan:
<re.Match object; span=(0, 4), match='Kode'>
None
<re.Match object; span=(14, 17), match='INV'>
<re.Match object; span=(0, 27), match='Kode pesanan: INV-2025-4821'>Pemanggilan re.match(r"INV", teks) gagal bukan karena INV tidak ada di dalam teks, melainkan karena INV tidak berada di karakter pertama. Sebaliknya, re.fullmatch(r".+", teks) berhasil karena pola .+ — satu karakter apa pun atau lebih, dari Chapter Character Classes dan Quantifiers — sanggup menghabiskan seluruh 27 karakter string.
Isi Object re.Match #
Ketiga fungsi di atas mengembalikan object re.Match saat berhasil dan None saat gagal. Object tersebut menyimpan lokasi dan konteks kecocokan:
| Attribute atau method | Isi |
|---|---|
hasil.group(0) | seluruh teks yang cocok |
hasil.start() | indeks karakter pertama kecocokan |
hasil.end() | indeks satu posisi setelah karakter terakhir |
hasil.span() | tuple berisi start dan end |
hasil.string | string yang sedang diperiksa |
import re
hasil = re.search(r"INV-\d{4}", "Kode pesanan: INV-2025-4821")
print(hasil.span(), hasil.start(), hasil.end())
print(hasil.string)
print(hasil.group(0))Output yang Dihasilkan:
(14, 22) 14 22
Kode pesanan: INV-2025-4821
INV-2025Method span() melaporkan kecocokan menempati karakter indeks 14 sampai sebelum indeks 22. Method end() selalu menunjuk satu posisi setelah karakter terakhir — konsisten dengan aturan slicing dari Chapter Indexing dan Slicing String, sehingga hasil.string[hasil.start():hasil.end()] selalu menghasilkan teks kecocokan.
findall dan Perilakunya Saat Ada Group #
Fungsi findall() mengumpulkan semua kecocokan ke dalam satu list — dengan satu kejutan: begitu pola memuat capture group, findall() tidak lagi mengembalikan teks kecocokan utuh, melainkan isi group-group tersebut:
import re
transkrip = "Budi: 85, Siti: 92, Ani: 78"
print(re.findall(r"\d+", transkrip))
print(re.findall(r"(\w+): (\d+)", transkrip))Output yang Dihasilkan:
['85', '92', '78']
[('Budi', '85'), ('Siti', '92'), ('Ani', '78')]Pola kedua menghasilkan list berisi tuple — pasangan nama dan nilai yang rapi untuk diolah lebih lanjut. Bila hanya sebagian pola yang perlu ditangkap, gunakan non-capturing group (?:...) dari Chapter Groups dan Captures agar kecocokan utuh tetap dikembalikan.
finditer dan Pola yang Di-compile #
Fungsi findall() memuat semua kecocokan ke memori sekaligus. Fungsi finditer() mengembalikan iterator object re.Match satu per satu — pilihan yang lebih hemat untuk teks panjang dan memberi akses ke posisi tiap kecocokan. Untuk pola yang dipakai berulang kali, re.compile() mengompilasi pola sekali menjadi object pattern yang bisa dipanggil berkali-kali:
import re
pola_nilai = re.compile(r"(\w+): (\d+)")
transkrip = "Budi: 85, Siti: 92, Ani: 78"
total = 0
for cocok in pola_nilai.finditer(transkrip):
print(cocok.group(1), "mendapat nilai", cocok.group(2))
total += int(cocok.group(2))
print("Rata-rata:", total / 3)Output yang Dihasilkan:
Budi mendapat nilai 85
Siti mendapat nilai 92
Ani mendapat nilai 78
Rata-rata: 85.0Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 3 (
pola_nilai = re.compile(r"(\w+): (\d+)")): moduleremengompilasi string pola menjadi object pattern yang siap pakai; object tersebut disimpan ke variabel agar bisa dipakai ulang. - Baris 6 (
total = 0): penghitung total nilai diinisialisasi dengan nol sebelum perulangan. - Baris 7-9 (
for cocok in pola_nilai.finditer(transkrip):): setiap iterasi menerima satu objectre.Match; methodcocok.group(1)berisi nama, methodcocok.group(2)berisi nilai yang dikonversi keintsebelum dijumlahkan. - Baris 10 (
print("Rata-rata:", total / 3)):total / 3menghasilkan85.0karena operator pembagian/selalu menghasilkanfloat.
Object pattern juga memiliki method search(), match(), fullmatch(), sub(), dan kawan-kawannya: bentuk pola_nilai.search(teks) setara dengan re.search(pola_nilai, teks).