Ekstraksi angka dari string adalah tugas umum dalam pemrosesan data dan analisis teks. Seringkali, data yang kita miliki mengandung angka yang tersembunyi di dalam teks yang lebih besar. Python, dengan modul re
(regex atau regular expression), menyediakan alat yang ampuh untuk mengekstrak angka-angka ini secara efisien dan akurat. Artikel ini akan membahas berbagai teknik dan pertimbangan penting dalam mengekstrak angka dari string menggunakan regex di Python.
Mengapa Regex untuk Ekstraksi Angka?
Regex menawarkan beberapa keunggulan dibandingkan metode ekstraksi angka lainnya:
- Fleksibilitas: Regex dapat menangani berbagai format angka, termasuk bilangan bulat, bilangan desimal, angka dengan pemisah ribuan, angka dengan tanda plus atau minus, dan bahkan angka dalam notasi ilmiah.
- Presisi: Regex memungkinkan kita untuk menentukan pola yang tepat untuk angka yang ingin kita ekstrak, sehingga mengurangi risiko kesalahan dan ambiguitas.
- Efisiensi: Modul
re
di Python dioptimalkan untuk kinerja, memungkinkan ekstraksi angka yang cepat bahkan dari string yang besar. - Kemampuan Adaptasi: Regex dapat dengan mudah diubah dan disesuaikan untuk menangani kasus-kasus khusus atau format angka yang tidak standar.
Dasar-Dasar Regex untuk Ekstraksi Angka
Sebelum kita menyelami teknik yang lebih kompleks, mari kita bahas beberapa elemen dasar regex yang relevan untuk ekstraksi angka:
\d
: Mencocokkan digit tunggal (0-9).+
: Mencocokkan satu atau lebih kemunculan karakter atau grup sebelumnya.*
: Mencocokkan nol atau lebih kemunculan karakter atau grup sebelumnya.?
: Mencocokkan nol atau satu kemunculan karakter atau grup sebelumnya (opsional)..
: Mencocokkan karakter apa pun (kecuali baris baru).\.
: Mencocokkan karakter titik literal.[]
: Mendefinisikan set karakter. Misalnya,[0-9]
sama dengan\d
.()
: Membuat grup penangkap. Bagian dari string yang cocok dengan grup ini dapat diekstrak secara terpisah.^
: Mencocokkan awal string.$
: Mencocokkan akhir string.|
: Operator "atau".\-
: Mencocokkan karakter minus literal.\+
: Mencocokkan karakter plus literal.
Dengan memahami elemen-elemen ini, kita dapat membangun pola regex yang efektif untuk mengekstrak angka dari string.
Contoh Sederhana: Mengekstrak Bilangan Bulat
Untuk memulai, mari kita lihat contoh sederhana untuk mengekstrak bilangan bulat dari string:
import re string = "Terdapat 12 apel dan 3 jeruk di keranjang." pola = r"\d+" # Mencari satu atau lebih digit angka = re.findall(pola, string) print(angka) # Output: ['12', '3']
Dalam contoh ini, pola \d+
mencari satu atau lebih digit berturut-turut. Fungsi re.findall()
mengembalikan daftar semua string yang cocok dengan pola tersebut.
Teknik Tingkat Lanjut untuk Ekstraksi Angka
Setelah memahami dasar-dasarnya, mari kita eksplorasi teknik yang lebih canggih untuk menangani kasus-kasus yang lebih kompleks:
1. Mengekstrak Bilangan Desimal
Untuk mengekstrak bilangan desimal, kita perlu memperhitungkan karakter titik (.
) sebagai pemisah desimal. Pola regex yang sesuai adalah:
import re string = "Harga barang adalah Rp 12.500,75." pola = r"\d+\.\d+" # Mencari satu atau lebih digit, diikuti titik, diikuti satu atau lebih digit angka = re.findall(pola, string) print(angka) # Output: ['12.500']
Perhatikan bahwa kita menggunakan \.
untuk mencocokkan titik literal, karena .
tanpa escape memiliki arti khusus dalam regex (mencocokkan karakter apa pun).
2. Menangani Angka dengan Pemisah Ribuan
Di banyak negara, angka menggunakan pemisah ribuan (misalnya, koma atau titik). Untuk mengekstrak angka dengan pemisah ribuan, kita dapat menggunakan pola yang lebih kompleks:
import re string = "Jumlah penduduk adalah 1.234.567 orang." pola = r"\d{1,3}(?:\.\d{3})+" #Mencari satu hingga tiga digit diikuti nol atau lebih grup pemisah ribuan (titik diikuti tiga digit). angka = re.findall(pola, string) print(angka) # Output: ['1.234.567']
Dalam pola ini:
\d{1,3}
: Mencari satu hingga tiga digit.(?:\.\d{3})+
: Mencari satu atau lebih kemunculan grup non-penangkap yang terdiri dari titik diikuti oleh tiga digit.(?:...)
digunakan untuk membuat grup non-penangkap, yang berarti bahwa grup tersebut tidak akan diekstrak sebagai bagian terpisah dari hasil.
3. Mengekstrak Angka Negatif dan Positif
Untuk mengekstrak angka negatif dan positif, kita perlu memperhitungkan tanda plus (+
) atau minus (-
) di depan angka. Pola regex yang sesuai adalah:
import re string = "Suhu hari ini adalah -5 derajat Celcius, kemarin +2 derajat." pola = r"[+-]?\d+\.?\d*" # Mencari opsional plus atau minus, diikuti satu atau lebih digit, opsional titik, diikuti nol atau lebih digit. angka = re.findall(pola, string) print(angka) # Output: ['-5', '+2']
Dalam pola ini:
[+-]?
: Mencari opsional tanda plus atau minus.
4. Mengekstrak Angka dalam Notasi Ilmiah
Angka dalam notasi ilmiah (misalnya, 1.23e+05) dapat diekstrak dengan pola yang lebih kompleks:
import re string = "Jaraknya adalah 1.23e+05 meter." pola = r"[+-]?\d+\.?\d*[eE][+-]?\d+" #Mencari opsional plus atau minus, diikuti satu atau lebih digit, opsional titik, diikuti nol atau lebih digit, diikuti e atau E, diikuti opsional plus atau minus, diikuti satu atau lebih digit. angka = re.findall(pola, string) print(angka) # Output: ['1.23e+05']
Pola ini mencakup bagian eksponen (e atau E) dan tanda plus atau minus opsional di dalam eksponen.
5. Menggunakan Grup Penangkap untuk Ekstraksi Selektif
Terkadang, kita hanya ingin mengekstrak bagian tertentu dari angka. Misalnya, kita mungkin ingin mengekstrak hanya bagian desimal dari bilangan desimal. Dalam kasus ini, kita dapat menggunakan grup penangkap:
import re string = "Harga barang adalah Rp 12.500,75." pola = r"\d+\.(?P<desimal>\d+)" # Membuat grup bernama "desimal" untuk bagian desimal match = re.search(pola, string) if match: desimal = match.group("desimal") print(desimal) # Output: 75
Dalam contoh ini, kita menggunakan (?P<desimal>\d+)
untuk membuat grup bernama "desimal" yang menangkap bagian desimal dari angka. Fungsi re.search()
mengembalikan objek match
jika pola ditemukan. Kita kemudian dapat menggunakan match.group("desimal")
untuk mengakses bagian yang ditangkap.
Studi Kasus: Analisis Data Penjualan
Mari kita terapkan teknik-teknik yang telah kita pelajari dalam studi kasus yang lebih realistis: analisis data penjualan. Misalkan kita memiliki data penjualan dalam format berikut:
ID Produk: A123, Penjualan: Rp 1.250.000, Diskon: 10% ID Produk: B456, Penjualan: Rp 2.750.500, Diskon: 5% ID Produk: C789, Penjualan: Rp 500.000, Diskon: 20%
Kita ingin mengekstrak informasi berikut dari data ini:
- ID Produk
- Jumlah Penjualan
- Persentase Diskon
Berikut adalah kode Python yang melakukan ekstraksi ini:
import re data = """ ID Produk: A123, Penjualan: Rp 1.250.000, Diskon: 10% ID Produk: B456, Penjualan: Rp 2.750.500, Diskon: 5% ID Produk: C789, Penjualan: Rp 500.000, Diskon: 20% """ # Membagi data menjadi baris-baris baris = data.strip().split("\n") # Membuat list untuk menyimpan hasil hasil = [] # Iterasi melalui setiap baris for baris in baris: # Mengekstrak ID Produk match_id = re.search(r"ID Produk: (\w+)", baris) id_produk = match_id.group(1) if match_id else None # Mengekstrak Jumlah Penjualan match_penjualan = re.search(r"Penjualan: Rp ([\d.]+)", baris) penjualan = match_penjualan.group(1) if match_penjualan else None if penjualan: penjualan = penjualan.replace('.','') # Menghilangkan titik ribuan penjualan = int(penjualan) #Konversi ke integer # Mengekstrak Persentase Diskon match_diskon = re.search(r"Diskon: (\d+)%", baris) diskon = match_diskon.group(1) if match_diskon else None if diskon: diskon = int(diskon) # Menambahkan hasil ke list hasil.append({ "ID Produk": id_produk, "Penjualan": penjualan, "Diskon": diskon }) # Menampilkan hasil for item in hasil: print(item)
Kode ini menggunakan regex untuk mengekstrak informasi yang relevan dari setiap baris data. Hasilnya disimpan dalam list dictionary, yang kemudian dapat digunakan untuk analisis lebih lanjut.
Validasi Data dan Penanganan Kesalahan
Penting untuk diingat bahwa ekstraksi angka dari string tidak selalu sempurna. Data mungkin mengandung kesalahan atau format yang tidak terduga. Oleh karena itu, penting untuk melakukan validasi data dan menangani kesalahan dengan baik.
Berikut adalah beberapa teknik validasi dan penanganan kesalahan yang dapat digunakan:
- Memeriksa keberadaan kecocokan: Sebelum mencoba mengakses grup penangkap, pastikan bahwa pola regex benar-benar cocok dengan string. Gunakan
if match:
untuk memeriksa apakahre.search()
mengembalikan objekmatch
yang valid. - Menangani pengecualian: Jika Anda mencoba mengonversi string yang diekstrak menjadi angka, gunakan blok
try...except
untuk menangani pengecualian yang mungkin terjadi (misalnya,ValueError
jika string tidak dapat dikonversi menjadi angka). - Menggunakan fungsi validasi: Buat fungsi validasi khusus untuk memverifikasi bahwa angka yang diekstrak berada dalam rentang yang diharapkan atau memenuhi kriteria lain.
- Membersihkan data: Sebelum melakukan ekstraksi, bersihkan data dengan menghapus karakter yang tidak diinginkan atau menstandarisasi format angka.
Perbandingan Performa: Regex vs. Metode String Tradisional
Sebagai perbandingan, mari kita tinjau performa ekstraksi data menggunakan Regex vs. metode String tradisional.
Metode | Kelebihan | Kekurangan | Kasus Penggunaan Terbaik |
---|---|---|---|
Regex | Fleksibel, efisien untuk pola kompleks, mudah diadaptasi untuk berbagai format | Bisa lebih lambat untuk pola sederhana, kurva belajar yang curam untuk pola kompleks | Ekstraksi angka dari string dengan pola yang kompleks, format yang bervariasi, atau kebutuhan validasi |
String Tradisional | Lebih cepat untuk pola sederhana, lebih mudah dibaca dan dipahami | Kurang fleksibel, sulit menangani pola kompleks, membutuhkan lebih banyak kode untuk validasi | Ekstraksi angka dari string dengan pola yang sangat sederhana dan format yang konsisten |
Analisis Teknis:
- Regex: Menggunakan finite state machine untuk pencocokan pola. Meskipun efisien untuk pola yang kompleks, overhead inisialisasi dan kompilasi pola dapat membuatnya lebih lambat untuk pola yang sangat sederhana.
- String Tradisional: Menggunakan operasi string bawaan seperti
split()
,replace()
, danisdigit()
. Operasi ini umumnya lebih cepat untuk pola sederhana karena tidak ada overhead kompilasi pola.
Contoh Kode Perbandingan:
Regex:
import re import time string = "Harga barang adalah Rp 1.250.000,75." pola = r"([\d.]+)" start_time = time.time() for _ in range(10000): angka = re.findall(pola, string) end_time = time.time() print(f"Waktu eksekusi Regex: {end_time - start_time} detik") # Output akan bervariasi
String Tradisional:
import time string = "Harga barang adalah Rp 1.250.000,75." start_time = time.time() for _ in range(10000): parts = string.split("Rp ") if len(parts) > 1: angka = parts[1].replace(".","").replace(",",".").strip() #Bersihkan data else: angka = None end_time = time.time() print(f"Waktu eksekusi String Tradisional: {end_time - start_time} detik") # Output akan bervariasi
Kesimpulan:
Pilihan antara Regex dan metode String tradisional tergantung pada kompleksitas pola dan kebutuhan performa. Untuk pola sederhana dan format yang konsisten, metode String tradisional mungkin lebih cepat. Namun, untuk pola yang kompleks dan format yang bervariasi, Regex menawarkan fleksibilitas dan efisiensi yang lebih baik. Penting untuk mengukur performa kedua metode pada data Anda sendiri untuk membuat keputusan yang tepat.
Kesimpulan
Ekstraksi angka dari string menggunakan regex di Python adalah teknik yang ampuh dan fleksibel. Dengan memahami dasar-dasar regex dan teknik-teknik tingkat lanjut, Anda dapat mengekstrak angka dari berbagai format string dengan akurat dan efisien. Ingatlah untuk selalu melakukan validasi data dan menangani kesalahan dengan baik untuk memastikan kualitas data Anda. Dengan mempertimbangkan tradeoff antara Regex dan metode String tradisional, Anda dapat memilih pendekatan yang paling sesuai dengan kebutuhan Anda.