Cara menggunakan REGX pada Python

Badan Administrasi Keamanan Sosial Amerika Serikat memiliki data nama-nama bayi populer tiap tahunnya (lihat nama bayi).

File yang digunakan pada latihan ini ada di direktori google-python-exercises/babynames (download google-python-exercises.zip). Buat code pada file babynames.py. File baby1990.html, baby1992.html … merupakan file raw html yang sama seperti situs keamanan sosial yang sudah kalian kunjungi tadi. Lihat file html dan pikirkan bagaimana caranya untuk mengambil data tersebut.

Soal

Pada file babynames.py, buat function extract_names(filename) yang dapat mengambil file baby1990.html dan mengembalikan data dari file ke dalam sebuah List yang berisi tahun bertipe data String dan nama-peringkat bertipe data String lalu diurutkan berdasarkan huruf. [‘2006’, ‘Aaliyah 91’, ‘Abagail 895’, ‘Aaron 57’, …]. Ubah main() agar bisa memanggil function extract_names() dan print hasilnya. Perlu diingat bahwa untuk melakukan parsing halaman web secara umum, regular expression tidak terlalu bagus, tapi halaman web mempunyai format yang sederhana dan konsisten.

Dari pada memisahkan nama anak laki-laki dan perempuan, kita akan menggabungkannya menjadi 1. Di beberapa tahun, ada nama yang muncul lebih dari sekali, tapi nama yang kita pakai cuma 1. (Opsi: buat algoritma terkait kasus ini yang dapat memilih nama dengan peringkat lebih kecil).

Buat program secara bertahap, jalankan tiap langkah/print sesuatu sebelum lanjut ke langkah berikutnya, dari pada kita membuat seluruh program dalam 1 tahapan. Cara ini digunakan oleh programmer yang sudah berpengalaman.

Melakukan print data pada tiap langkah membantu kita berpirikir bagaimana membuat struktur data untuk langkah berikutnya. Python sangat cocok digunakan dalam pengembangan program secara bertahap. Contoh, langkah pertama langsung ke point permasalahannya, ekstrak dan print tahun. Berikut adalah tahap yang saya sarankan:

  1. Ekstrak semua teks dari file dan print hasilnya.
  2. Cari dan ekstrak tahun dan print hasilnya.
  3. Ekstrak nama dan peringkat lalu print hasilnya.
  4. Simpan data nama ke dalam dictionary dan print hasilnya.
  5. Buat List [year, ‘nama-peringkat’] dan print hasilnya.
  6. Ubah main() agar bisa memanggil List ExtractNames.

Sebelumnya kita membuat function yang bisa melakukan print. Tambahkan perintah return yang dapat mengembalikan data hasil ekstraksi sehingga function tersebut dapat digunakan kembali.

Buat main() yang memanggil extract_names() tiap command line dan print teks yang dihasilkan. Agar List terlihat bagus, gunakan perintah join.

In [..]: text = '\n'.join(mylist) + '\n'

Teks yang dihasilkan dari setiap file terlihat seperti ini:

2006
Aaliyah 91
Aaron 57
Abagail 895
Abbey 695
Abbie 650
...
Jawaban

Impor modul re => modul untuk regular expression.

In [1]: import re

Buat function extract_names(), dengan argumen filename.

In [2]:
def extract_names(filename):

Inisiasi variabel items dengan array kosong.

In [2]:
def extract_names(filename):
items = []

Inisiasi variabel name_to_rank dengan dictionary kosong.

In [2]:
def extract_names(filename):
items = []
name_to_rank = {}

Buat variabel f dan inisiasi dengan function open(file, mode) untuk mengembalikan obyek file, biasanya terdapat 2 argumen yaitu nama file dan mode. Isi nama file dengan filename dan isi mode dengan r yang berarti hanya bisa dilakukan pembacaan obyek.

In [2]:
def extract_names(filename):
items = []
name_to_rank = {}
f = open(filename, 'r')

Buat variabel text dan inisiasi dengan join(sequence). Isi argumen dengan items untuk menggabungkan semua elemen items, dengan enter (‘\n’) sebagai pemisah antar elemen. Output:

Apakah kamu pernah membuat password, dan di sana kita diminta harus menggunakan huruf kapital, angka, dan simbol.

Jika kita tidak mematuhinya, maka akan diberikan peringatan:

Cara menggunakan REGX pada Python

Bagaimana program bisa tau, kalau kita tidak mematuhinya?

Bagaimana program mampu mengenali password yang kita inputkan?

Ini semua berkat regex.

Di balik program yang terlihat cukup cerdas itu, ada peran regex di sana.

Jadi:

Apa itu Regex?

Regex adalah singkatan dari Regular Expresion.

Regex merupakan sebuah teks (string) yang mendefinisikan sebuah pola pencarian sehingga dapat membantu kita untuk melakukan matching (pencocokan), locate (pencarian), dan manipulasi teks.

Konsep tentang regex pertamakali muncul di tahun 1951, ketika seorang ilmuan matematikan bernama Stephen Cole Kleene memformulasikan definisi tentang bahasa formal.

Kemudian konsep ini diadopsi di beberapa program dan menjadi umum digunakan pada program pemeroses teks seperti sed, awk,

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
0, dll.

Cara menggunakan REGX pada Python

Menurut saya, regex itu seperti mantra ajaib yang punya kesaktian tinggi hehe. 😄

Regex memudahkan kita untuk memanipulasi teks, tapi juga kadang berbahaya.. karena bisa mengubah teks yang tidak kita inginkan.

Biasanya itu terjadi karena kesalahan pola yang diberikan.

Manfaat Regex dalam Pemrograman

Berdasarkan definisi regex yang sudah kita pelajari, kita bisa tahu tiga manfaat penting regex yakni pencarian, pencocokan, dan manipulasi teks.

Berikut ini beberapa contoh pemanfaatan regex dalam pemrograman:

1. Regex untuk Validasi Data

Seperti contoh kasus password tadi, regex digunakan untuk matching atau pencocokan teks.

Pertama-tama, kita harus mendefinisikan pola regex untuk data yang valid. Kemudian, kita lakukan pencocokan dengan pola tersebut.

Berikut ini contohnya di HTML dan Javascript.

Kode HTML:

<form id="myform">
    <label for="passowrd">Buat Passwordlabel>
    <input type="password" name="password" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" />
    <input type="submit" value="simpan" />
    <p id="invalid-passowrd" style="display:none;color:red">Panjang password minimal 8 kareter, dan harus mengandung huruf kapital, angka, dan simbolp>
form>

Perhatikan atribut

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
1, atribut ini digunakan untuk menyimpan pola regex. Pada contoh di atas, polanya adalah pengecekan karakter yang diinputkan pada password.

Ini pernah saya bahas juga di: Validasi Data di HTML.

Berikut ini kode Javascript untuk memberikan feedback:

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});

Pada contoh ini, kita tidak menggunakan regex di dalam Javascript. Melainkan kita menggunakannya pada HTML.

Kode javascript di atas, hanya bertugas untuk mengecek.. apakah nilai dari field password sudah sesuai atau tidak dengan yang ada pada atribut

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
1.

Berikut ini hasilnya:

Live Demo: Buka di Codepen.io

2. Regex untuk Pencarian

Contoh penerapan regex untuk pencarian sebenarnya hampir sama dengan validasi data.

Pola regex dimasukan dalam kata kunci, lalu dicocokan dengan database atau teks.

Contoh program yang menerapkan ini adalah

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
0.

Program

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
0 (globally search for a regular expression and print matching lines) biasanya kita temukan di sistem operasi Unix dan Linux, bahkan ini menjadi program yang selalu ada di setiap distro Linux.

Program

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
0 melakukan pencarian berdasarkan pola regex yang diberikan, lalu mencetak output hasilnya.

Contoh:

Misalkan kita ingin mencari teks pada

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
6. Kita bisa melihat isi file
const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
6 dengan cat.

cat /var/log/syslog

Perintah ini akan menampilkan banyak sekali teks. Nah di sini kita bisa memanfaatkan

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
0 untuk mencari teks tertentu pada log.

Misalnya:

Saya ingin tau apa saja log yang berkaitan dengan jaringan:

cat /var/log/syslog | grep network

Perhatikan, kata

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
9 ini adalah pola regex yang akan menjadi kata kunci pencarian.

Maka hasilnya:

Cara menggunakan REGX pada Python

Grep akan mewarnai hasil teks yang cocok dengan pola regex yang diberikan.

Dari hasil tersebut, saya bisa tahu apa saja log yang sudah dilakukan pada jaringan di komputer saya.

Tidak hanya di

const passwordField = document.querySelector("[name=password]");

passwordField.addEventListener("keyup", (event) => {
    if(!passwordField.validity.valid){
        console.error("passowrd invalid");
        document.getElementById("invalid-passowrd").style.display = "block";
    } else {
         console.info("passowrd valid");
        document.getElementById("invalid-passowrd").style.display = "none";
    }
});
0, pada beberapa teks editor juga menerapkan regex untuk pencarian.

Contohnya: Teks editor VS Code.

Pada VS Code, ada mode pencarian dengan regex. Di sana kita bisa memasukan pola regex.

Misal saya ingin mencari di mana saja penulisan nama file js dalam kode.

Cara menggunakan REGX pada Python

Ini sangat memudahkan..

Saya sering pakai ini terutama saat melakukan Find and Replace.

3. Regex untuk Find and Replace

Salah satu manfaat regex yang saya suka adalah find and replace. Fitur ini membantu saya untuk mengelola teks dan konten lebih efisien.

Bayangkan saja..

Di petani kode ada ratusan konten dengan format markdown. Lalu di suatu kondisi saya ingin mengubah beberapa teks di semua konten ini.

Jika dilakukan satu-per-satu secara manual, tentu ini akan menguras banyak waktu dan tenaga.

Tapi..

Berkat regex, saya bisa melakukannya dalam hitungan detik. Cukup bikin pola pencarian dan pola untuk mengubahnya (subtitusi).

Contoh:

Saya ingin mengubah ini:

{{< fig "/img/website-cern.png" "Website CERN (2020)"  >}}
{{< fig "/img/tim-robert.jpg" 
"Tim Berners-Lee dan Robert Cailliau" >}}

Menjadi ini:

![Website CERN (2020)](/img/website-cern.png "Website CERN (2020)")
![Tim Berners-Lee dan Robert Cailliau](/img/tim-robert.jpg "Tim Berners-Lee dan Robert Cailliau")

Maka pola pencariannya adalah:

(\{\{< fig) "(.+)"( | \n)"(.+)" (>\}\})

Dan pola untuk mengubahnya adalah:

![$4]($2 "$4")

Maka hasilnya:

Cara menggunakan REGX pada Python

Pada pola pencarian di atas, saya melakukan pengelompokan atau grouping sebanyak lima kelompok. Lalu melakukan subtitusi atau replace.

Cara menggunakan REGX pada Python

Penjelasan detail tentang pola ini, bisa kamu lihat di regex101.com.

Contoh lainnya:

Cara menggunakan REGX pada Python

Pada kasus ini, saya ingin mengambil data

cat /var/log/syslog
1 dan menghilangkan teks dibelakangnya.

Hasilnya setelah disubtitusi:

Cara menggunakan REGX pada Python

Tantangan Belajar Regex

Menurut saya:

Tantangan tersulit dalam belajar Regex adalah membuat sendiri dan menghafal simbol pada pola regex. 😄

Setiap simbol dalam regex, punya arti.

Misalkan untuk simbol

cat /var/log/syslog
2 adalah simbol untuk mencari kata (word) dan jika ditambahkan
cat /var/log/syslog
3 mejadi
cat /var/log/syslog
4 simbol ini menjadi punya arti yang berbeda.

Beberapa simbol mudah saya ingat karena sering memakainya.

  • cat /var/log/syslog
    5 — untuk grouping;
  • cat /var/log/syslog
    6 — simbol untuk logika or (atau alternatif);
  • cat /var/log/syslog
    7 — untuk mencari karekter dari huruf
    cat /var/log/syslog
    8 sampai
    cat /var/log/syslog
    9;
  • cat /var/log/syslog | grep network
    0 — untuk mencari karakter dari huruf
    cat /var/log/syslog | grep network
    1 sampai
    cat /var/log/syslog | grep network
    2;
  • cat /var/log/syslog | grep network
    3 — Untuk mencari angka
    cat /var/log/syslog | grep network
    4 sampai
    cat /var/log/syslog | grep network
    5;
  • cat /var/log/syslog
    2 — untuk mencari kata;
  • cat /var/log/syslog | grep network
    7 — untuk mencari angka;

Sisanya, saya googling sendiri hehe. 😸

Sebenarnya ada cara gampang untuk mengingatnya, yakni dengan mindmap dan sering-sering dipakai.

Berikut ini mindmap simbol regex yang saya buat berdasarkan referensi dari regexr.

Cara menggunakan REGX pada Python

Selain mindmap, kamu juga bisa gunakan cheatsheet. Cheatsheet dicetak, lalu ditempel di dekat meja kerja. Kalau lagi butuh, tinggal contek di cheatsheet 😄 seperti main GTA di PS 2.

Nah untuk cheatsheet ini, kamu bisa cari di Google. Banyak kok.

Cara menggunakan REGX pada Python

Oh iya, untuk memudahkan belajar Regex.. kamu bisa gunakan website berikut:

  • Regex101.com
  • Regexr.com

Kedua website ini menyediakan penjelasan detail tentang tiap-tiap simbol regex dan juga di sana kita bisa testing hasilnya.

Apa Selanjutnya?

Jadi intinya:

Regex itu adalah sebuah teks dalam bentuk pola untuk pencarian dan banyak dipakai untuk pencocokan, pencarian, dan manipulasi teks.

Nah, berikutnya..

Silahkan pelajari simbol-simbol regex dan cara menggunakan regex di bahasa pemrograman yang kamu kuasai.

Apa itu Regex di Python?

Regex merupakan singkatan dari Regular Expression yang merupakan serangkaian karakter yang mendefinisikan sebuah pola pencarian. Beberapa bidang yang menggunakan metode ini adalah seperti Natural Language Processing (NLP), Text Mining, Data Validation, Finding Pattern, Anomaly Detection dan lainnya.

Modul apa dalam python untuk menjalankan regex?

Modul RegEx Python memiliki paket bawaan yang disebut re , yang dapat digunakan untuk bekerja dengan Ekspresi Reguler.

Apa itu Regex Pattern?

Regex itu adalah sebuah teks dalam bentuk pola untuk pencarian dan banyak dipakai untuk pencocokan, pencarian, dan manipulasi teks.

Apa itu regular expression Javascript?

Regular Expression(Regex) adalah pola yang digunakan sebagai kriteria untuk mendapatkan kombinasi karakter pada suatu string.