Method string yang telah kita pelajari bekerja dengan sempurna selama yang dicari adalah teks yang persis diketahui. Namun bagaimana menemukan “semua angka di dalam kalimat”, atau memeriksa “apakah teks ini berpola nomor telepon Indonesia”? Pertanyaan berpola seperti ini tidak bisa dijawab find() yang hanya mencocokkan teks literal. Jawabannya adalah regular expressions (regex): bahasa mini untuk mendeskripsikan pola teks. Chapter ini hanya memperkenalkan konsep dan dua fungsi dasarnya — pembahasan mendalam tentang seluruh kosakata regex menempati satu section tersendiri, Regular Expressions dan Parsing.
Kapan Regex Dibutuhkan #
Aturan praktisnya sederhana: jika potongan yang dicari bisa dideskripsikan dengan satu kata atau kalimat tetap, gunakan method string biasa (in, find(), startswith()); jika yang dicocokkan adalah pola — digit berulang, karakter opsional, awalan nomor telepon — barulah regex masuk. Perbandingan berikut memperlihatkan batasnya:
import re
laporan = "Budi membeli 3 buku, 2 pensil, dan 1 penghapus."
print("3" in laporan)
print(re.findall(r"\d+", laporan))Output yang Dihasilkan:
True
['3', '2', '1']Operator in hanya menjawab kehadiran karakter "3" saja. Pola r"\d+" — yang dibaca “satu digit atau lebih” — menemukan ketiga kelompok angka sekaligus lewat re.findall(), dan hasilnya berupa list berisi string. Perhatikan pula prefix r pada pola: pola regex penuh backslash wajib ditulis sebagai raw string sesuai pembahasan Chapter Raw Strings.
re.search(): Mencari Pola di Mana Saja #
Fungsi re.search() memindai seluruh string dan mengembalikan object re.Match untuk kemunculan pertama yang cocok — atau None jika pola tidak ditemukan sama sekali:
import re
teks = "Pesanan #1234 dikirim ke Jalan Merdeka No. 56"
hasil = re.search(r"\d+", teks)
print(hasil.group())Output yang Dihasilkan:
1234Interpreter Python mengevaluasi pola r"\d+" terhadap teks dari kiri ke kanan, berhenti di kecocokan pertama — digit 1234 pada nomor pesanan — lalu membungkus informasi kecocokan tersebut dalam object re.Match. Method .group() pada object tersebut mengembalikan potongan teks yang cocok.
re.match(): Mencocokkan dari Awal String #
Fungsi kembarannya, re.match(), menerapkan aturan lebih ketat: pencocokan harus mulai tepat di karakter pertama string. Perbandingan keduanya paling jelas dilihat langsung:
import re
teks = "Harga: Rp150.000"
print(re.match(r"\d+", teks))
print(re.search(r"\d+", teks).group())Output yang Dihasilkan:
None
150Mari kita bedah dua baris tersebut:
- Baris 5 (
re.match(r"\d+", teks)): string dimulai dengan hurufH, bukan digit, sehinggare.match()langsung gagal dan mengembalikanNone— angka150yang ada di tengah string tidak dipedulikan. - Baris 6 (
re.search(...)):re.search()menemukan150karena fungsi tersebut bebas memindai di posisi mana pun.
Perbedaan ini membuat masing-masing punya tempatnya: re.match() untuk validasi format dari karakter pertama (nama berkas, kode produk), re.search() untuk mendeteksi kehadiran pola di tengah teks panjang.
Contoh Praktis: Validasi Pola Nomor HP #
Sebagai contoh penutup, kita validasi nomor telepon seluler Indonesia: pola ^08\d{8,11}$ berarti “diawali 08, diikuti 8 sampai 11 digit, lalu berakhir”. Jangkar ^ dan $ masing-masing menuntut kecocokan dari awal dan sampai akhir string:
import re
print(re.match(r"^08\d{8,11}$", "081234567890"))
print(re.match(r"^08\d{8,11}$", "12345"))Output yang Dihasilkan:
<re.Match object; span=(0, 12), match='081234567890'>
NoneNomor "081234567890" cocok sepenuhnya — object re.Match yang tampil lengkap dengan rentang kecocokan span=(0, 12) dan potongan teks yang cocok — sedangkan "12345" tidak diawali 08 sehingga re.match() mengembalikan None.
Kosakata regex sesungguhnya jauh lebih kaya dari \d dan jangkar: kelas karakter, pengulangan, pengelompokan, hingga parsing bertingkat. Seluruhnya dibahas sistematis pada section Regular Expressions dan Parsing — sekarang kita setidaknya sudah tahu kapan harus menoleh ke sana.