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:

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

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

python
import re

teks = "Pesanan #1234 dikirim ke Jalan Merdeka No. 56"

hasil = re.search(r"\d+", teks)
print(hasil.group())

Output yang Dihasilkan:

text
1234

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

python
import re

teks = "Harga: Rp150.000"

print(re.match(r"\d+", teks))
print(re.search(r"\d+", teks).group())

Output yang Dihasilkan:

text
None
150

Mari kita bedah dua baris tersebut:

  1. Baris 5 (re.match(r"\d+", teks)): string dimulai dengan huruf H, bukan digit, sehingga re.match() langsung gagal dan mengembalikan None — angka 150 yang ada di tengah string tidak dipedulikan.
  2. Baris 6 (re.search(...)): re.search() menemukan 150 karena 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:

python
import re

print(re.match(r"^08\d{8,11}$", "081234567890"))
print(re.match(r"^08\d{8,11}$", "12345"))

Output yang Dihasilkan:

text
<re.Match object; span=(0, 12), match='081234567890'>
None

Nomor "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.