Regex, atau Regular Expression, merupakan alat yang sangat ampuh dalam memanipulasi dan mencari teks berdasarkan pola tertentu. Kemampuan ini sangat berguna dalam berbagai skenario, mulai dari validasi input, ekstraksi data, hingga penggantian teks secara massal. Salah satu kasus penggunaan yang umum adalah mencari atau memanipulasi daftar kata tertentu dalam sebuah teks. Untuk melakukan ini secara efektif, kita perlu membangun pola Regex yang tepat, termasuk menggunakan jangkar batas kata (\b
) untuk memastikan kita hanya mencocokkan kata yang lengkap, bukan bagian dari kata yang lebih panjang.
Mengapa Jangkar Batas Kata Penting?
Sebelum kita masuk ke detail implementasi, mari kita pahami mengapa jangkar batas kata (\b
) itu penting. Anggap saja kita ingin mencari kata "kucing" dalam teks. Tanpa jangkar batas kata, pola Regex sederhana seperti kucing
akan mencocokkan "kucing" dalam kata "kucinggarong" atau "semangkucing". Ini tentu bukan yang kita inginkan.
Jangkar batas kata (\b
) bertindak sebagai penanda batas antara karakter kata (huruf, angka, dan garis bawah) dan karakter non-kata (spasi, tanda baca, awal/akhir string). Dengan menambahkan \b
di awal dan akhir pola, kita memastikan bahwa kita hanya mencocokkan kata "kucing" yang berdiri sendiri, bukan bagian dari kata lain. Jadi, pola yang benar adalah \bkucing\b
.
Membangun Pola Regex dari Daftar Kata (String atau Array)
Sekarang, mari kita lihat bagaimana cara membangun pola Regex dari daftar kata, baik dalam bentuk string maupun array.
1. Daftar Kata dalam Bentuk String (Dipisahkan dengan Karakter Tertentu)
Misalkan kita memiliki string yang berisi daftar kata yang dipisahkan oleh koma:
kata_string = "apel, jeruk, mangga, pisang"
Kita ingin membangun pola Regex yang akan mencocokkan salah satu dari kata-kata ini. Langkah-langkahnya adalah sebagai berikut:
-
Memecah String menjadi Array: Pertama, kita perlu memecah string menjadi array menggunakan pemisah koma. Dalam Python, kita bisa menggunakan fungsi
split()
:kata_array = kata_string.split(", ") # Perhatikan spasi setelah koma print(kata_array) # Output: ['apel', 'jeruk', 'mangga', 'pisang']
-
Menambahkan Jangkar Batas Kata: Selanjutnya, kita iterasi melalui array dan menambahkan jangkar batas kata di awal dan akhir setiap kata:
kata_regex = [r"\b" + kata + r"\b" for kata in kata_array] print(kata_regex) # Output: ['\\bapel\\b', '\\bjeruk\\b', '\\bmangga\\b', '\\bpisang\\b']
Perhatikan penggunaan
r""
untuk raw string. Ini penting agar backslash (\
) tidak diinterpretasikan sebagai karakter escape oleh Python. -
Menggabungkan Pola Regex: Sekarang, kita perlu menggabungkan semua pola Regex individual menjadi satu pola besar menggunakan operator "atau" (
|
). Dalam Python, kita bisa menggunakan fungsijoin()
:pola_regex = "|".join(kata_regex) print(pola_regex) # Output: \bapel\b|\bjeruk\b|\bmangga\b|\bpisang\b
-
Menggunakan Pola Regex: Terakhir, kita bisa menggunakan pola Regex ini untuk mencari atau memanipulasi teks.
import re teks = "Saya suka makan apel dan jeruk, tapi kadang-kadang juga mangga. Pisang juga enak!" hasil = re.findall(pola_regex, teks) print(hasil) # Output: ['apel', 'jeruk', 'mangga', 'pisang']
2. Daftar Kata dalam Bentuk Array
Jika kita sudah memiliki daftar kata dalam bentuk array, langkah-langkahnya sedikit lebih sederhana:
kata_array = ["apel", "jeruk", "mangga", "pisang"]
Kita bisa langsung melanjutkan ke langkah 2 dan 3 dari contoh sebelumnya:
kata_regex = [r"\b" + kata + r"\b" for kata in kata_array] pola_regex = "|".join(kata_regex) import re teks = "Saya suka makan apel dan jeruk, tapi kadang-kadang juga mangga. Pisang juga enak!" hasil = re.findall(pola_regex, teks) print(hasil)
Studi Kasus: Filter Kata Kasar
Salah satu contoh penggunaan praktis dari teknik ini adalah untuk membuat filter kata kasar. Kita bisa memiliki daftar kata kasar yang ingin kita deteksi dan hilangkan dari teks.
kata_kasar = ["anjing", "babi", "monyet"] # Contoh saja, daftar bisa lebih panjang kata_regex = [r"\b" + kata + r"\b" for kata in kata_kasar] pola_regex = "|".join(kata_regex) import re teks = "Dasar anjing! Kamu babi!" teks_bersih = re.sub(pola_regex, "***", teks) # Ganti kata kasar dengan "***" print(teks_bersih) # Output: Dasar ***! Kamu ***!
Dalam contoh ini, kita menggunakan fungsi re.sub()
untuk mengganti setiap kata kasar yang ditemukan dengan "***". Ini adalah cara sederhana untuk menyensor teks secara otomatis.
Tips dan Trik Tambahan
-
Case-Insensitive Matching: Jika kita ingin mencocokkan kata tanpa memperhatikan huruf besar atau kecil, kita bisa menambahkan flag
re.IGNORECASE
ataure.I
ke fungsire.findall()
ataure.sub()
. Contoh:hasil = re.findall(pola_regex, teks, re.IGNORECASE)
-
Escape Karakter Khusus Regex: Jika daftar kata kita berisi karakter khusus Regex (seperti
.
atau*
), kita perlu melakukan escaping karakter tersebut agar Regex tidak salah menginterpretasikannya. Kita bisa menggunakan fungsire.escape()
untuk melakukan ini secara otomatis:import re kata_array = ["a.b", "c*d"] kata_regex = [r"\b" + re.escape(kata) + r"\b" for kata in kata_array] pola_regex = "|".join(kata_regex) print(pola_regex) # Output: \ba\.b\b|\bc\*d\b
-
Performa: Untuk daftar kata yang sangat panjang, menggabungkan semua pola Regex dengan operator "atau" (
|
) bisa menjadi lambat. Dalam kasus seperti ini, pertimbangkan untuk menggunakan struktur data yang lebih efisien seperti Trie atau Aho-Corasick algorithm. Namun, untuk sebagian besar kasus penggunaan, pendekatan sederhana ini sudah cukup baik.
Studi Kasus: Analisis Sentimen dengan Regex
Analisis sentimen adalah proses menentukan nada emosional (positif, negatif, atau netral) dari sebuah teks. Regex bisa digunakan sebagai langkah awal dalam analisis sentimen, terutama untuk mengidentifikasi kata-kata kunci yang mengindikasikan sentimen tertentu.
Misalkan kita memiliki daftar kata positif dan negatif:
kata_positif = ["bagus", "hebat", "luar biasa", "menyenangkan"] kata_negatif = ["buruk", "jelek", "mengerikan", "mengecewakan"]
Kita bisa membangun pola Regex untuk mendeteksi kata-kata ini dalam teks dan menghitung skor sentimen berdasarkan jumlah kata positif dan negatif yang ditemukan.
import re def hitung_sentimen(teks): pola_positif = r"\b(" + "|".join(kata_positif) + r")\b" pola_negatif = r"\b(" + "|".join(kata_negatif) + r")\b" jumlah_positif = len(re.findall(pola_positif, teks, re.IGNORECASE)) jumlah_negatif = len(re.findall(pola_negatif, teks, re.IGNORECASE)) skor_sentimen = jumlah_positif - jumlah_negatif return skor_sentimen teks = "Film ini sangat bagus dan menyenangkan, tapi ada beberapa bagian yang buruk." skor = hitung_sentimen(teks) print(f"Skor sentimen: {skor}") # Output: Skor sentimen: 1 if skor > 0: print("Sentimen positif") elif skor < 0: print("Sentimen negatif") else: print("Sentimen netral")
Tentu saja, ini adalah contoh yang sangat sederhana. Analisis sentimen yang lebih canggih melibatkan teknik Natural Language Processing (NLP) yang lebih kompleks, tetapi contoh ini mengilustrasikan bagaimana Regex bisa digunakan sebagai alat dasar dalam proses tersebut.
Tabel Perbandingan Metode Pembentukan Regex dari List Kata
Berikut adalah tabel perbandingan beberapa metode pembuatan regex dari list kata, beserta kelebihan dan kekurangannya, dalam gaya bahasa yang santai:
Metode | Penjelasan Singkat | Kelebihan | Kekurangan | Cocok Untuk |
---|---|---|---|---|
**Looping Sederhana + ` | `** | Menggabungkan setiap kata dengan \b di awal dan akhir, lalu menggabungkannya dengan operator ` |
`. | Mudah dipahami, implementasi cepat. |
re.escape() untuk Kata Khusus |
Sama seperti di atas, tapi menggunakan re.escape() untuk menangani karakter khusus dalam kata. |
Lebih aman karena menangani karakter khusus regex secara otomatis. | Tetap kurang efisien untuk list kata yang sangat besar. | List kata yang mungkin mengandung karakter khusus regex (misalnya, tanda kurung, bintang, titik). |
Menggunakan Trie |
Membangun struktur data Trie dari list kata, lalu membuat regex dari Trie tersebut. |
Sangat efisien untuk list kata yang sangat besar, terutama jika banyak kata memiliki awalan yang sama. | Implementasi lebih kompleks. | List kata yang sangat besar (misalnya, ribuan atau lebih), terutama jika banyak kata memiliki awalan yang sama. |
Menggunakan Aho-Corasick |
Algoritma yang lebih canggih dari Trie , memungkinkan pencarian multi-pattern yang sangat cepat. |
Sangat efisien untuk pencarian multi-pattern yang kompleks. | Implementasi paling kompleks. | Pencarian multi-pattern yang kompleks, membutuhkan performa tinggi. |
Penjelasan Santai:
-
Looping Sederhana: Ini cara paling dasar dan langsung. Bayangkan kamu punya daftar nama buah, kamu tambahin "batas" di depan dan belakang tiap nama, terus kamu gabungin semua nama itu pake "atau". Cocok buat yang gak mau ribet dan daftarnya gak terlalu panjang.
-
re.escape()
: Nah, kalo daftarmu isinya kata-kata aneh yang punya arti khusus di dunia regex (misalnya ada tanda bintang atau titik), kamu perlu pakere.escape()
. Biar regex gak bingung, dikira kamu mau nyari "semua karakter" padahal kamu cuma mau nyari tanda bintang beneran. -
Trie
: Ini udah mulai naik level.Trie
itu kayak pohon yang cabangnya nyambungin huruf-huruf dari kata-katamu. Jadi, kalo banyak kata yang punya awalan sama,Trie
bisa nyimpen informasinya lebih hemat dan nyari kata jadi lebih cepet. Cocok buat daftar yang panjang banget. -
Aho-Corasick
: Ini jurus pamungkas buat yang pengen performa maksimal. Algoritma ini lebih canggih dariTrie
dan bisa nyari banyak kata sekaligus dengan super cepat. Tapi, implementasinya juga paling rumit. Cocok buat yang bener-bener butuh kecepatan tinggi.
Intinya, pilih metode yang paling sesuai sama kebutuhanmu. Kalo daftarnya pendek, looping sederhana udah cukup. Kalo daftarnya panjang dan banyak kata yang mirip, Trie
atau Aho-Corasick
bisa jadi pilihan yang lebih baik.
Kesimpulan
Membangun pola Regex dari daftar kata dan mengelilingi setiap kata dengan jangkar batas kata adalah teknik yang berguna untuk berbagai tugas pemrosesan teks. Dengan memahami langkah-langkah dasar dan tips tambahan yang telah dibahas, kita bisa membuat pola Regex yang lebih akurat dan efisien. Ingatlah untuk selalu mempertimbangkan kebutuhan spesifik dari kasus penggunaan kita dan memilih metode yang paling sesuai. Regex memang terlihat rumit pada awalnya, tetapi dengan latihan dan pemahaman yang baik, ia bisa menjadi alat yang sangat berharga dalam kotak peralatan pemrograman kita. Selamat mencoba!