re: ekspresi reguler

Modul re untuk pattern, group, findall, sub, dan regex terkompilasi.

Daftar isi

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.

python Contoh: search dan match
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))
text Keluaran
<re.Match object; span=(15, 19), match='2026'>
2026 15 19
None

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

SimbolArti
\dsatu digit
\wsatu karakter kata, yaitu huruf, digit, atau garis bawah
\ssatu 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.

python Contoh: kelompok bernama untuk memecah tanggal
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())
text Keluaran
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.

python Contoh: findall untuk mengumpulkan seluruh kecocokan
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())
text Keluaran
['3', '2', '1']
0 satu
5 dua
9 tiga

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

python Contoh: sub untuk menyensor dan pola terkompilasi
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)
text Keluaran
Kontak lama: ****-****-**** sejak ****.
jatuh tempo 02/11/2026

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

python Contoh: kuantor serakah melahap terlalu banyak
import re

teks = "<b>tebal</b> dan <i>miring</i>"
print(re.findall(r"<.+>", teks))
print(re.findall(r"<.+?>", teks))
text Keluaran
['<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.

python Contoh: pola yang tidak valid
import re

try:
    re.compile(r"([a-z")
except re.error as e:
    print("re.error:", e)
text Keluaran
re.error: unterminated character set at position 1

Pola 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, sedangkan re.match() hanya menguji awal teks, dan keduanya mengembalikan None bila tidak cocok.
  • Tanda kurung menangkap bagian kecocokan, ?P<nama> menamainya, dan tangkapannya dibaca melalui group(), groups(), atau groupdict().
  • findall() mengembalikan list seluruh kecocokan, finditer() mengembalikan objek kecocokan lengkap dengan posisinya, dan sub() mengganti kecocokan dengan dukungan rujukan kelompok.
  • re.compile() menyusun pola menjadi objek untuk pemakaian berulang, sementara kuantor serakah + dan * dibuat malas dengan +? dan *?.

Referensi#