Belajar Regex Python (re Module) Lengkap untuk Pemula

waktu pertama kali melihat pola Regex (Regular Expression) seperti r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", jujur kepala saya langsung pusing. kelihatannya seperti deretan karakter acak yang tidak masuk akal ๐
namun setelah dipelajari logikanya, regex ternyata adalah salah satu alat paling sakti yang wajib dikuasai programmer. pekerjaan validasi formulir yang tadinya membutuhkan 30 baris logika if-else bertingkat bisa diselesaikan hanya dalam 1 atau 2 baris regex. modul bawaan Python bernama re menyediakan semua fitur regex modern yang sangat cepat dan andal.
di artikel ini kita pelajari modul re Python dari nol: memahami konsep raw string, kamus simbol metakarakter penting, perbedaan search, match, dan findall, teknik manipulasi teks dengan re.sub(), hingga studi kasus validasi email dan nomor WhatsApp Indonesia.
sebelum mendalami regex, pastikan kalian sudah paham fungsi dasar pengolahan string biasa seperti yang saya ulas di belajar python string manipulation.
1. Konsep Dasar Regex dan Kewajiban Raw String (r"…")
regex adalah bahasa pola untuk mencocokkan susunan teks. di Python, semua pola regex wajib ditulis sebagai Raw String dengan menambahkan huruf r sebelum tanda kutip pembuka:
# โ Rawan masalah: backslash dibaca sebagai karakter escape Python
pola_salah = "\\d+"
# โ
Benar dan bersih: backslash diteruskan utuh ke mesin regex
pola_benar = r"\d+"
tanpa huruf r, Python akan mencoba mengartikan kombinasi seperti \b sebagai karakter backspace atau \n sebagai baris baru sebelum pola tersebut sampai ke mesin regex. dengan raw string, kita terhindar dari bug misterius.
2. Kamus Simbol Metakarakter Regex Paling Penting
kalian tidak perlu menghafal ratusan simbol regex sekaligus. hafalkan dulu simbol-simbol yang paling sering dipakai berikut:
| Simbol | Arti / Fungsi | Contoh Pola | Cocok Dengan |
|---|---|---|---|
\d | Digit angka (0-9) | r"\d{3}" | 123, 987 |
\D | Bukan digit angka | r"\D+" | Halo, abc |
\w | Karakter kata (huruf, angka, _) | r"\w+" | user_123 |
\W | Bukan karakter kata | r"\W" | @, !, spasi |
\s | Whitespace (spasi, tab, enter) | r"\s+" | , \t, \n |
. | Karakter apa saja (kecuali newline) | r"b.ku" | buku, baku |
^ | Menandai awal baris/string | r"^Admin" | Admin123 |
$ | Menandai akhir baris/string | r"\.pdf$" | laporan.pdf |
[abc] | Salah satu dari karakter dalam kurung | r"[aeiou]" | huruf vokal |
[a-z] | Rentang karakter huruf kecil | r"[0-9]" | sama dengan \d |
* | 0 kali atau lebih (opsional banyak) | r"ha*" | h, ha, haaa |
+ | 1 kali atau lebih (wajib minimal 1) | r"ha+" | ha, haaa |
? | 0 atau 1 kali (opsional) | r"https?" | http, https |
{n} | Tepat sebanyak n kali | r"\d{4}" | 2026 (tahun) |
{n,m} | Antara n sampai m kali | r"\d{2,4}" | 12, 123, 1234 |
() | Grouping / penangkapan data | r"(\d+)-(\w+)" | mengambil grup |
3. Empat Fungsi Pencarian Utama di Modul re
modul re memiliki beberapa fungsi pencarian dengan perilaku yang berbeda:
A. re.search(): Mencari di Seluruh Teks (Paling Fleksibel)
mencari kecocokan pertama di mana saja di dalam teks. jika ketemu, mengembalikan objek Match, jika tidak ketemu mengembalikan None.
import re
teks = "Order ID: ORD-9921 tanggal 2026-09-29"
hasil = re.search(r"ORD-\d+", teks)
if hasil:
print("Ditemukan:", hasil.group()) # Output: ORD-9921
print("Rentang posisi:", hasil.span()) # Output: (10, 18)
B. re.match(): Hanya Mencocokkan dari Karakter Pertama
re.match() hanya memeriksa apakah teks diawali oleh pola tersebut.
import re
teks = "Order ID: ORD-9921"
hasil = re.match(r"ORD-\d+", teks)
print(hasil) # Output: None (karena teks diawali 'Order', bukan 'ORD-')
# Akan cocok jika teks diawali langsung oleh pola
hasil2 = re.match(r"ORD-\d+", "ORD-9921 selesai")
print(hasil2.group()) # Output: ORD-9921
C. re.findall(): Mengambil Semua Kecocokan Menjadi List
jika kalian ingin mengekstrak semua angka, semua email, atau semua tag HTML:
import re
teks = "Daftar harga: Buku Rp 45000, Pensil Rp 3000, Penggaris Rp 7500"
semua_harga = re.findall(r"\d+", teks)
print(semua_harga)
# Output: ['45000', '3000', '7500']
D. re.finditer(): Iterasi Hemat Memori untuk Data Besar
jika teks yang diproses berukuran puluhan megabyte, re.findall() akan memakan RAM besar karena membuat list raksasa. gunakan re.finditer():
import re
log_server = "IP: 192.168.1.1 - Status: 200\nIP: 10.0.0.5 - Status: 404"
for match in re.finditer(r"IP:\s*([\d.]+)", log_server):
print("IP ditemukan:", match.group(1))
4. Mengganti Teks dengan re.sub() (Text Cleaning)
fungsi re.sub(pola, pengganti, string) adalah pisau bedah untuk membersihkan data teks kotor:
import re
# Menghapus semua karakter selain angka (misal membersihkan input nomor HP)
no_hp_kotor = "+62 (812) - 3456 - 7890"
no_hp_bersih = re.sub(r"\D", "", no_hp_kotor)
print(no_hp_bersih) # Output: 6281234567890
# Menghapus tag HTML dari teks artikel
html_mentah = "<p>Halo <b>Dunia</b>! Kunjungi <a href='#'>link ini</a>.</p>"
teks_polos = re.sub(r"<[^>]+>", "", html_mentah)
print(teks_polos) # Output: Halo Dunia! Kunjungi link ini.
# Merapikan spasi ganda yang berantakan menjadi satu spasi saja
teks_spasi = "Python itu sangat menyenangkan."
print(re.sub(r"\s+", " ", teks_spasi))
# Output: Python itu sangat menyenangkan.
5. Kinerja Lebih Cepat dengan re.compile()
jika kalian menjalankan pola regex di dalam perulangan ribuan baris, mengompilasi pola terlebih dahulu menggunakan re.compile() akan menghemat waktu eksekusi secara signifikan:
import re
# Kompilasi pola sekali saja di luar loop
pola_email = re.compile(r"^[\w.-]+@[\w.-]+\.\w+$")
daftar_email = ["[email protected]", "bukan-email", "[email protected]", "[email protected]"]
for email in daftar_email:
if pola_email.search(email):
print(f"โ
Valid: {email}")
else:
print(f"โ Tidak valid: {email}")
dengan re.compile(), Python mengubah pola string regex menjadi struktur bytecode mesin di awal, sehingga saat dipanggil berulang kali di dalam loop, eksekusinya langsung instan.
6. Capturing Groups: Mengambil Potongan Data Spesifik
tanda kurung () di regex tidak hanya berfungsi untuk mengelompokkan logika, tapi juga untuk menangkap potongan teks tertentu (capturing groups):
import re
log = "2026-09-29 14:35:10 [ERROR] Database connection timeout"
# Menangkap: Tanggal, Level Log, dan Pesan
pola = r"^(\d{4}-\d{2}-\d{2})\s+[\d:]+\s+\[(\w+)\]\s+(.+)$"
match = re.search(pola, log)
if match:
print("Tanggal:", match.group(1)) # 2026-09-29
print("Level :", match.group(2)) # ERROR
print("Pesan :", match.group(3)) # Database connection timeout
Named Groups: Memberi Nama pada Kolom Hasil
agar kode lebih mudah dibaca, kalian bisa memberi nama grup dengan sintaks (?P<nama_grup>pola):
import re
pola_nama = r"^(?P<tahun>\d{4})-(?P<bulan>\d{2})-(?P<hari>\d{2})"
match = re.search(pola_nama, "2026-09-29")
print(match.group("tahun")) # 2026
print(match.group("bulan")) # 09
print(match.groupdict()) # {'tahun': '2026', 'bulan': '09', 'hari': '29'}
7. Flag Regex Penting
kalian bisa menambahkan parameter flag di akhir fungsi re:
re.IGNORECASE(ataure.I): mengabaikan perbedaan huruf besar dan kecilre.MULTILINE(ataure.M): membuat simbol^dan$berlaku di setiap awal dan akhir baris, bukan hanya awal/akhir teks secara keseluruhanre.DOTALL(ataure.S): membuat simbol titik.juga mencocokkan karakter newline (\n)
import re
teks = "Halo Python\nhalo java\nHALO KOTLIN"
# Cari semua kata yang diawali 'halo' tanpa peduli huruf besar/kecil di tiap baris
hasil = re.findall(r"^halo \w+", teks, re.IGNORECASE | re.MULTILINE)
print(hasil) # Output: ['Halo Python', 'halo java', 'HALO KOTLIN']
8. Studi Kasus Nyata: Validasi Email dan Nomor HP Indonesia
berikut fungsi validasi siap pakai yang bisa kalian gunakan di aplikasi nyata:
import re
def validasi_nomor_hp_indonesia(nomor: str) -> bool:
"""
Mendukung format:
- 081234567890
- +6281234567890
- 6281234567890
Panjang digit wajar antara 10 sampai 14 karakter.
"""
# Buang spasi atau strip dulu
nomor_bersih = re.sub(r"[\s-]", "", nomor)
pola = r"^(\+62|62|0)8[1-9][0-9]{7,11}$"
return bool(re.match(pola, nomor_bersih))
def validasi_email(email: str) -> bool:
pola = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
return bool(re.match(pola, email.strip()))
# Uji Coba Nomor HP
print(validasi_nomor_hp_indonesia("0812-3456-7890")) # True
print(validasi_nomor_hp_indonesia("+62 857 1234 5678")) # True
print(validasi_nomor_hp_indonesia("021-5551234")) # False (bukan nomor seluler)
# Uji Coba Email
print(validasi_email("[email protected]")) # True
print(validasi_email("[email protected]")) # True
print(validasi_email("email_tanpa_domain@")) # False
Kesimpulan
Fungsi Modul re | Kegunaan Utama |
|---|---|
re.search() | Mencari kecocokan pertama di seluruh string |
re.match() | Memeriksa kecocokan hanya di awal string |
re.findall() | Mengambil seluruh kecocokan dalam bentuk list |
re.finditer() | Mengambil seluruh kecocokan sebagai iterator objek |
re.sub() | Mengganti potongan teks yang cocok dengan teks baru |
re.compile() | Mengompilasi pola regex agar cepat dipanggil berulang kali |
regex bukan untuk dihafal mati, melainkan dipahami konsep metakarakternya. dengan menguasai kombinasi raw string, fungsi pencarian, dan penangkapan grup, kalian memiliki kemampuan parsing teks yang sangat tangguh untuk berbagai kebutuhan pemrograman.
setelah menguasai regex, kalian bisa melanjutkan membaca panduan lengkap ekosistem bahasa ini di belajar python lengkap.
Baca Juga Mengenai :
Pertanyaan yang Sering Diajukan
Apa perbedaan antara re.match() dan re.search() di Python?
re.match() hanya mencari kecocokan tepat di awal string (karakter pertama). Jika pola ada di tengah teks, re.match() akan mengembalikan None. Sedangkan re.search() mencari kecocokan pola di seluruh bagian string dari awal sampai akhir.
Mengapa pola regex di Python selalu ditulis dengan awalan r (raw string)?
Awalan r (misalnya r"\d+") memberitahu Python untuk memperlakukan tanda backslash (\) sebagai karakter biasa, bukan karakter escape. Tanpa r, tanda backslash seperti \n atau \t akan diartikan sebagai enter atau tab sebelum diserahkan ke modul regex.
Kapan sebaiknya memakai re.compile()?
Gunakan re.compile() jika pola regex yang sama akan dijalankan berulang-ulang, misalnya di dalam loop ribuan baris data. Dengan dikompilasi sekali di awal, Python tidak perlu mengurai pola regex tersebut di setiap putaran perulangan, sehingga proses jauh lebih cepat.
Apa perbedaan re.findall() dan re.finditer()?
re.findall() mengembalikan semua kecocokan langsung ke dalam sebuah list di memori. re.finditer() mengembalikan iterator dari objek match satu per satu, sehingga jauh lebih hemat memori ketika memproses file teks berukuran besar.
Bagaimana cara mengganti teks menggunakan pola regex di Python?
Gunakan fungsi re.sub(pola, pengganti, teks). Fungsi ini akan mencari semua teks yang sesuai dengan pola regex dan menggantinya dengan teks baru, sangat populer untuk membersihkan karakter asing atau tag HTML.
Bagaimana cara membuat regex tidak sensitif terhadap huruf besar dan kecil (case-insensitive)?
Tambahkan flag re.IGNORECASE atau singkatannya re.I pada parameter ketiga fungsi regex, contohnya: re.search(r"python", teks, re.IGNORECASE). Pola ini akan cocok dengan "Python", "PYTHON", maupun "pYtHoN".

