Modul re menyediakan ekspresi reguler (regular expression), yaitu bahasa pola untuk mencari, mengurai, dan mengganti teks menurut aturan bentuk, bukan menurut kata yang ditulis persis. Sebuah pola (pattern) mendeskripsikan bentuk teks yang dicari, misalnya “empat digit berurutan” atau “kata di antara tanda kutip”. Topik ini membahas fungsi pencarian, kelompok (group) yang menangkap bagian kecocokan, findall untuk mengumpulkan seluruh kecocokan, sub untuk penggantian, serta pola terkompilasi yang dipakai berulang.
Pencarian pertama: search dan match#
Fungsi re.search() memindai seluruh teks dan mengembalikan objek kecocokan (match) pertama yang ditemukan, sedangkan re.match() hanya menguji bagian awal teks. Objek kecocokan menyimpan teks yang ditemukan pada group(), posisi awal dan akhir pada start() dan end(), serta keduanya sekaligus pada span(). Apabila tidak ditemukan apa pun, keduanya mengembalikan None.
import re
teks = "Nomor peserta: 2026-114"
cocok = re.search(r"\d+", teks)
print(cocok)
print(cocok.group(), cocok.start(), cocok.end())
print(re.match(r"\d+", teks))<re.Match object; span=(15, 19), match='2026'>
2026 15 19
NonePola r"\d+" berarti satu digit atau lebih, dan search() menemukan 2026 pada posisi 15 sampai 19. Pemanggilan match() pada teks yang sama menghasilkan None karena teks tidak diawali digit, dan perbedaan inilah yang paling sering tertukar pada pemula. Pola ditulis sebagai raw string, yaitu string berawalan r, agar tanda garis miring terbalik diperlakukan apa adanya oleh Python.
Karakter khusus yang dipakai sepanjang topik ini dirangkum pada tabel berikut.
| Simbol | Arti |
|---|---|
\d | satu digit |
\w | satu karakter kata, yaitu huruf, digit, atau garis bawah |
\s | satu karakter spasi putih |
+ | satu kali atau lebih |
* | nol kali atau lebih |
? | nol kali atau satu kali |
{m,n} | antara m sampai n kali |
[abc] | salah satu karakter di dalam kurung |
^ dan $ | awal dan akhir teks |
Kelompok untuk menangkap bagian kecocokan#
Tanda kurung pada pola membentuk kelompok yang menangkap potongan teks tertentu, dan tanda ?P<nama> memberi kelompok sebuah nama. Kelompok bernama dibaca dengan group("nama") atau dikumpulkan sekaligus oleh groupdict(), sedangkan groups() mengembalikan seluruh tangkapan sebagai tuple. Teknik ini menjadi dasar penguraian data terstruktur seperti tanggal dan kode.
import re
pola = r"(?P<tahun>\d{4})-(?P<bulan>\d{2})-(?P<hari>\d{2})"
cocok = re.search(pola, "Tenggat: 2026-11-02 jam 09:00")
print(cocok.group("tahun"), cocok.group("bulan"), cocok.group("hari"))
print(cocok.groupdict())
print(cocok.groups())2026 11 02
{'tahun': '2026', 'bulan': '11', 'hari': '02'}
('2026', '11', '02')Pola tersebut menuntut empat digit, tanda hubung, dua digit, dan seterusnya, sehingga angka jam pada teks tidak ikut tertangkap karena bentuknya tidak cocok. Seluruh tangkapan tetap berupa string, sehingga komponen yang akan dihitung harus dikonversi dengan int() terlebih dahulu. Kelompok bernama membuat pola tetap terbaca berminggu-minggu kemudian, karena nama tangkapannya sudah menjelaskan isinya.
findall dan finditer#
Fungsi re.findall() mengembalikan seluruh kecocokan sebagai list, berisi string apabila pola tidak berkelompok dan berisi tuple apabila polanya memiliki kelompok. Fungsi re.finditer() mengembalikan iterator objek kecocokan penuh, sehingga posisi tiap kecocokan tetap dapat dibaca. Pilihan antara keduanya bergantung pada kebutuhan, yaitu apakah cukup teks kecocokannya atau posisinya juga diperlukan.
import re
teks = "Beli 3 buku, 2 pulpen, dan 1 penghapus"
print(re.findall(r"\d+", teks))
for m in re.finditer(r"\w+", "satu dua tiga"):
print(m.start(), m.group())['3', '2', '1']
0 satu
5 dua
9 tigaPola tanpa kelompok menghasilkan list string, dan hasilnya langsung dapat dihitung dengan len() atau dikonversi menjadi angka. Iterasi finditer() memperlihatkan posisi setiap kata, yang berguna untuk menyorot lokasi pada antarmuka pengguna atau melaporkan posisi kesalahan pada berkas data.
sub dan pola terkompilasi#
Fungsi re.sub() mengganti seluruh kecocokan dengan teks baru, dan rujukan r"\1", r"\2", atau r"\g<nama>" menyisipkan tangkapan kelompok ke dalam teks penggantinya. Apabila satu pola dipakai berulang, fungsi re.compile() mengompilasinya sekali menjadi objek pola yang memiliki metode search(), findall(), dan sub() sendiri.
import re
teks = "Kontak lama: 0812-3456-7890 sejak 2020."
poladigit = re.compile(r"\d{4}")
print(poladigit.sub("****", teks))
hasil = re.sub(
r"(?P<tahun>\d{4})-(?P<bulan>\d{2})-(?P<hari>\d{2})",
r"\g<hari>/\g<bulan>/\g<tahun>",
"jatuh tempo 2026-11-02",
)
print(hasil)Kontak lama: ****-****-**** sejak ****.
jatuh tempo 02/11/2026Objek poladigit dikompilasi sekali, kemudian metode sub() pada objek itu menyensor setiap rangkaian empat digit, termasuk tahun pada teks yang sama. Pada penggantian kedua, rujukan kelompok bernama menyusun ulang tanggal menjadi urutan hari, bulan, tahun tanpa mengurai stringnya secara manual. Kompilasi juga memeriksa keabsahan pola lebih awal, sehingga kesalahan penulisan pola terlihat sebelum perulangan pemrosesan data berjalan.
Kesalahan umum#
Kesalahan pertama adalah mengabaikan sifat serakah (greedy) dari kuantor + dan *. Kedua kuantor mencocokkan sebanyak mungkin karakter sebelum berhenti, sehingga pola yang tampak masuk akal menangkap rentangan yang terlalu luas.
import re
teks = "<b>tebal</b> dan <i>miring</i>"
print(re.findall(r"<.+>", teks))
print(re.findall(r"<.+?>", teks))['<b>tebal</b> dan <i>miring</i>']
['<b>', '</b>', '<i>', '</i>']Kuantor serakah menghasilkan satu kecocokan dari tanda < pertama sampai > terakhir, sedangkan bentuk malas (lazy) +? berhenti pada kesempatan pertama. Menambahkan ? setelah kuantor adalah perbaikan standar untuk kasus semacam ini. Kesalahan kedua adalah melupakan awalan r pada pola, sehingga \d diperlakukan sebagai escape pada string biasa. Pada Python modern hal ini memunculkan SyntaxWarning berupa invalid escape sequence, dan polanya tetap ditulis dengan r"\d" agar eksplisit.
Kesalahan ketiga adalah menulis pola dengan kurung yang tidak tertutup. Modul re memeriksa struktur pola pada waktu kompilasi dan menolaknya dengan error khusus.
import re
try:
re.compile(r"([a-z")
except re.error as e:
print("re.error:", e)re.error: unterminated character set at position 1Pola tersebut menyisakan kurung siku [a-z yang belum ditutup, sehingga modul re melaporkan kumpulan karakter yang belum ditutup pada posisi 1. Pesan errornya menyebut jenis masalah beserta posisi karakter yang memicunya, sehingga kesalahan struktur mudah dilacak. Menyusun pola bertahap dan mengujinya dengan search() pada contoh kecil lebih aman daripada menulis pola panjang sekaligus.
Ringkasan#
re.search()memindai seluruh teks dan mengembalikan objek kecocokan pertama, sedangkanre.match()hanya menguji awal teks, dan keduanya mengembalikanNonebila tidak cocok.- Tanda kurung menangkap bagian kecocokan,
?P<nama>menamainya, dan tangkapannya dibaca melaluigroup(),groups(), ataugroupdict(). findall()mengembalikan list seluruh kecocokan,finditer()mengembalikan objek kecocokan lengkap dengan posisinya, dansub()mengganti kecocokan dengan dukungan rujukan kelompok.re.compile()menyusun pola menjadi objek untuk pemakaian berulang, sementara kuantor serakah+dan*dibuat malas dengan+?dan*?.
Referensi#
- re — Python Software Foundation — Referensi lengkap sintaks ekspresi reguler dan fungsi modul re.
- Regular Expression HOWTO — Python Software Foundation — Panduan langkah demi langkah penggunaan ekspresi reguler di Python.