Pencarian kata biasa tidak cukup ketika kita perlu memvalidasi format email, menguji bentuk kode pesanan, atau menyusun ulang isi teks. Regular expression (regex) adalah bahasa pola untuk pekerjaan itu, dan hampir semua method .str menerimanya: contains(), count(), findall(), extract(), dan replace() dengan regex=True. Chapter ini membedah komponen pola yang paling sering dipakai, lalu mempraktikkannya pada kolom email dan kode transaksi TRX-2026-001.

Komponen Pola yang Sering Dipakai #

SimbolArtiContoh kecocokan
\.titik literal (bukan “karakter apa pun”)example.com
\dsatu digit2026
\d{4}tepat empat digit2026
^ dan $jangkar awal dan akhir stringpola berlaku utuh
[A-Z]satu karakter dalam rentangTRX
(?:a|b)grup non-capturing untuk alternasi.com atau .id
(...)capture group yang diambil extract()bagian bernama

Menguji dan Menghitung dengan Pola #

python
import pandas as pd

email = pd.Series([
    "[email protected]",
    "[email protected]",
    "[email protected]",
])
print(email.str.contains(r"@example\.com$").tolist())
print(email.str.contains(r"\.(?:com|id)$").tolist())

kode = pd.Series(["TRX-2026-001", "REF-2026-002", "TRX-2025-003"])
print(kode.str.contains(r"^TRX-\d{4}-\d{3}$").tolist())
print(kode.str.count(r"\d").tolist())
print(kode.str.findall(r"[A-Z]{3}").tolist())

bagian = kode.str.extract(r"(?P<jenis>[A-Z]+)-(?P<tahun>\d{4})")
print(bagian)

print(kode.str.replace(r"(\d{4})-(\d{3})", r"\2/\1", regex=True).tolist())

Output yang Dihasilkan:

text
[True, False, False]
[True, True, True]
[True, False, True]
[7, 7, 7]
[['TRX'], ['REF'], ['TRX']]
  jenis tahun
0   TRX  2026
1   REF  2026
2   TRX  2025
['TRX-001/2026', 'REF-002/2026', 'TRX-003/2025']

Mari kita telaah bagian penting skrip di atas:

  1. Baris 8: pola r"@example\.com$" menuntut teks berakhiran @example.com; jangkar $ membuat [email protected] dan [email protected] bernilai False.
  2. Baris 9: (?:com|id) adalah grup non-capturing — hanya mengelompokkan alternasi tanpa dianggap capture group, sehingga co.id ikut lolos.
  3. Baris 12: pola r"^TRX-\d{4}-\d{3}$" memvalidasi bentuk kode secara utuh: awalan TRX-, empat digit tahun, tiga digit nomor; hanya REF-2026-002 yang ditolak.
  4. Baris 13-14: count(r"\d") menghitung digit per baris (tujuh untuk setiap kode), dan findall(r"[A-Z]{3}") mengembalikan semua kecocokan berupa list — ['TRX'], ['REF'], ['TRX'].

Perbedaan findall() dan extract() ada pada bentuk hasil: findall() mengembalikan list semua kecocokan per baris, sedangkan extract() mengembalikan satu kolom per capture group. Keduanya sama-sama menuntut pola yang benar, bukan sekadar kata biasa.

Semua pola pada skrip ditulis dengan prefix r (raw string) agar backslash tidak perlu ditulis dua kali. Tanpa r, pola \d harus ditulis \\d dan mudah terbaca salah; kebiasaan raw string menjaga pola tetap persis seperti yang dijelaskan tabel di atas.

Menarik dan Menyusun Ulang Bagian Teks #

Baris 16-17 memakai extract() dengan dua capture group bernama, sehingga satu kolom kode terurai menjadi kolom jenis dan tahun — format yang jauh lebih mudah di-groupby daripada teks utuh. Baris 19 menunjukkan kekuatan replace() ketika regex=True: pola r"(\d{4})-(\d{3})" menangkap 2026 dan 001, lalu pengganti r"\2/\1" merujuk capture group pertama dan kedua secara terbalik, menghasilkan TRX-001/2026. Referensi \1 dan \2 inilah cara regex menyusun ulang bagian teks tanpa loop.

Dokumentasi resmi yang relevan: User Guide: Working with text data , pandas.Series.str.findall , dan pandas.Series.str.extract .

Dengan regex, pola rumus kini terkendali. Chapter berikutnya balik ke pekerjaan kebersihan data yang paling terasa dampaknya: menyeragamkan penulisan teks yang tidak konsisten sebelum data dipakai untuk analisis.