Kursus Python / Mencari dan memvalidasi pola teks dengan regular expression
Ekspresi reguler atau regular expression mencari pola teks atau memeriksa bentuk keseluruhan string. Kecocokan pola belum membuktikan bahwa tanggal atau jumlah mempunyai arti yang valid, sehingga pisahkan pencocokan, parsing, dan validasi aturan aplikasi.
Pilih pencarian bagian atau kecocokan seluruh teks
| Fungsi | Tujuan |
|---|---|
re.search |
Mencari bagian yang cocok di suatu lokasi dalam string |
re.fullmatch |
Memastikan seluruh string cocok |
re.finditer |
Menyediakan match berturut-turut beserta posisinya |
Raw string seperti r"..." mengurangi kebingungan antara escape string Python dengan escape pola. Awalan r tidak menonaktifkan arti khusus karakter dalam regular expression. Raw string juga tetap mengikuti aturan literal Python, termasuk batasan backslash pada akhir string.
Pola [A-Z] menyatakan satu huruf kapital ASCII, [0-9]{3} menyatakan tiga digit ASCII, dan [0-9]+ satu atau lebih digit ASCII. Pemilihan rentang ini disengaja; jangan menganggap semua karakter angka Unicode diterima. Rujuk dokumentasi modul re Python untuk sintaks dan fungsi.
Ekstrak bidang bernama dan parse tanggal
Simpan kode lengkap sebagai regex_demo.py dengan encoding UTF-8. Gunakan Python 3.12 atau lebih baru melalui lingkungan proyek, lalu jalankan python regex_demo.py. Tidak diperlukan paket atau berkas data tambahan.
import re
from datetime import date
text = "A001:3500 B002:8000"
pattern = re.compile(r"(?P<id>[A-Z][0-9]{3}):(?P<amount>[0-9]+)")
for match in pattern.finditer(text):
print(match["id"], int(match["amount"]))
value = "2026-10-17"
if re.fullmatch(r"[0-9]{4}-[0-9]{2}-[0-9]{2}", value):
print(date.fromisoformat(value))
Keluaran yang diharapkan:
A001 3500
B002 8000
2026-10-17
re.compile membuat objek pola yang dapat dipakai kembali. Bentuk (?P<id>...) dan (?P<amount>...) memberi nama pada grup sehingga bidang dapat diakses melalui match["id"] dan match["amount"]. Nilai grup tetap string; program mengubah jumlah ke integer secara eksplisit.
finditer mencari pasangan yang cocok pada teks yang dapat memuat beberapa pasangan. Ia tidak menyatakan bahwa seluruh teks telah dikonsumsi atau setiap unsur tidak cocok telah ditolak. Bagian tanggal menggunakan fullmatch untuk memeriksa bentuk empat digit, dua digit, dan dua digit, kemudian memakai date.fromisoformat untuk makna kalender.
Tangani tidak ada kecocokan dan validasi makna
re.search(r"[0-9]+", "no digits") mengembalikan None. Periksa if match is not None: sebelum mengakses grup. Memanggil group() pada None menimbulkan AttributeError, bukan pesan khusus bahwa angka tidak ditemukan.
Pola pencarian dapat menerima bagian dari input yang keseluruhannya tidak valid. Misalnya, teks prefixA001:3500suffix tetap memuat pasangan yang cocok. Pada A001:3.5, pola jumlah contoh dapat menemukan bagian A001:3 lalu meninggalkan .5. Untuk formulir yang menerima tepat satu pasangan, gunakan kontrak kecocokan seluruh string dan tangani penolakan, bukan menganggap hasil pencarian sebagai validasi lengkap.
Pola tanggal juga menerima bentuk 2026-02-30 atau 2026-99-99, karena hanya menghitung digit dan posisi tanda hubung. Parser tanggal kemudian menolaknya dengan ValueError. Ini mengikuti perbedaan tanggal sah dan representasi teks, bukan masalah yang selesai hanya dengan menambah panjang pola.
Untuk format seperti CSV yang mempunyai aturan pengutipan, gunakan parser CSV. Demikian pula, parser HTML memahami struktur dokumen dengan lebih sesuai daripada satu pola yang berusaha mencakup seluruh tata bahasanya. Regular expression tetap berguna untuk bidang teks terbatas yang kebutuhannya jelas.
Batasi kompleksitas dan uji wilayah input
- Ubah
A001menjadia001. Pasangan pertama tidak ditemukan karena pola membutuhkan kapital, tetapi pasangan B002 dan tanggal masih dicetak. - Pulihkan ID, lalu ubah jumlah pertama menjadi -1. Pola tidak menerima tanda minus setelah titik dua, sehingga pasangan itu tidak dicetak. Ini penghilangan dari pencarian, bukan laporan validasi negatif.
- Pulihkan pasangan dan ubah tanggal menjadi
2026-02-30. Bentuknya cocok, tetapi parser tanggal gagal setelah pasangan sebelumnya sudah dicetak. - Pulihkan seluruh input dan cocokkan tiga baris keluaran asli.
Jika aplikasi harus melaporkan setiap record yang ditolak, pencarian bebas seperti contoh belum cukup karena teks tidak cocok dapat dilewati. Tentukan batas record dan aturan pelaporan sebelum memilih search, finditer, atau fullmatch.
Jangan menjalankan pola yang tidak dipercaya terhadap input tanpa batas. Pola dengan kombinasi pengulangan dan backtracking tertentu dapat memerlukan waktu sangat lama pada masukan yang hampir cocok. Tetapkan pola yang diizinkan, batas ukuran input, dan pengujian kasus tidak cocok yang relevan. Membatasi ukuran saja tidak menjamin setiap pola aman; pilih bentuk yang sederhana sesuai masalah.
Hasil cocok, tipe data yang dapat dikonversi, dan makna data yang diterima merupakan tiga pemeriksaan berbeda. Menyebutnya secara terpisah membuat kesalahan parsial lebih mudah terlihat dan mencegah data yang salah tampak sah hanya karena ada substring yang cocok.




