Belajar Regex Python (re Module) Lengkap untuk Pemula

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

SimbolArti / FungsiContoh PolaCocok Dengan
\dDigit angka (0-9)r"\d{3}"123, 987
\DBukan digit angkar"\D+"Halo, abc
\wKarakter kata (huruf, angka, _)r"\w+"user_123
\WBukan karakter katar"\W"@, !, spasi
\sWhitespace (spasi, tab, enter)r"\s+", \t, \n
.Karakter apa saja (kecuali newline)r"b.ku"buku, baku
^Menandai awal baris/stringr"^Admin"Admin123
$Menandai akhir baris/stringr"\.pdf$"laporan.pdf
[abc]Salah satu dari karakter dalam kurungr"[aeiou]"huruf vokal
[a-z]Rentang karakter huruf kecilr"[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 kalir"\d{4}"2026 (tahun)
{n,m}Antara n sampai m kalir"\d{2,4}"12, 123, 1234
()Grouping / penangkapan datar"(\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 (atau re.I): mengabaikan perbedaan huruf besar dan kecil
  • re.MULTILINE (atau re.M): membuat simbol ^ dan $ berlaku di setiap awal dan akhir baris, bukan hanya awal/akhir teks secara keseluruhan
  • re.DOTALL (atau re.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 reKegunaan 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".

Sigit Nurhanafi avatar
Full-stack developer & technical writer. Berpengalaman di PHP, Laravel, NodeJS, MySQL, dan Python. Aktif menulis tutorial pemrograman dan maintaining open-source projects di PemburuKode sejak 2021.