Belajar Regex Regular Expression

By | October 23, 2021
Print Friendly, PDF & Email
6,300 Views

Banyak aplikasi saat ini mengharuskan pattern matching Sebagai contoh, memeriksa validitas alamat e-mail, Semua hal tersebut dilakukan dengan bantuan Regular Expression.

Apa itu Regular Expression?

Regular Expression adalah suatu cara menggambarkan susunan pola dalam suatu kalimat. Regular Expression ini banyak digunakan dalam text processing. Kalian mungkin bertanya-tanya apa sih kegunaan Regular Expression yang sering disingkat regex ini?

Pembahasan regex disini ditujukan untuk pemula sehingga pembahasannya tidak akan terlalu mendalam. Sebagai ilustrasi dari pemakaian regex, kita akan mengambil contoh berikut. Misalnya kalian memiliki sebuah daftar nama dan nomor telepon, kemudian ingin mencari pemilik nomor yang digit ke-3 nya adalah 8 dan digit terakhirnya adalah 9. Ataupun hanya ingin mengekstrak semua alamat e-mail ataupun website dalam suatu dokumen. Tentu yang kalian butuhkan adalah teknik Regular Expression.

Metakarakter

Metakarakter mempunyai makna khusus dalam penggunaan regex. Beberapa metakarakter yang sering digunakan untuk membuat regex adalah sebagai berikut:

$ ^ [ ] . * + ? / | { } ( )

Penjelasannya sebagai berikut

  • Pertama adalah metakarakter  ^  untuk menandakan pencocokan dimulai dari awal baris
  • metakarakter  $  untuk menandakan pencocokan dimulai dari akhir baris.
    • Misalnya ekspresi reguler  ^coba akan cocok dengan ‘coba’ yang didapat dari awal baris dan ekpresi coba$ akan cocok dengan ‘coba’ didapat dari akhir baris.
  • Selanjutnya kita membahas penggunaan  [ dan  ]  Kedua tanda tersebut digunakan untuk menentukan kelas karakter yang ingin dicocokkan.
  • Kita bisa menulis karakter-karakter yang ingin dicocokkan ataupun range karakter yang ingin dicocokkan dengan menggunakan tanda  - .
    • Misalnya expresi [abc] akan cocok dengan karakter ‘a’,’b’, dan ‘c’.
    • Expresi reguler [abc] akan sama hasilnya dengan [a-c]. Bila kita ingin mencocokan semua karakter kapital, kalian cukup membuat expresi reguler [A-Z]. Perlu diingat metakarakter tidak aktif di dalam kelas.
    • Di dalam kelas, metakarakter kehilangan makna khususnya. Misalnya ekspresi reguler [abc$] akan cocok dengan ‘a’,’b’,’c’ dan ‘$’; di mana $ kehilangan makna khususnya. Kalian dapat mengkomplemenkan set karakter dalam kelas dengan menggunakan metakarakter  ^ . Dengan demikian ekspresi [^a-c] akan cocok dengan karakter selain ‘a’,’b’,dan ‘c’.
  • Berikutnya adalah metakarakter  \ yang digunakan untuk menghilangkan makna khusus dari suatu metakarakter. Misalnya apabila kalian ingin mencocokkan karakter ‘[‘ ataupun ‘$’ , kalian cukup memberikan tanda ‘\’ sebelum karakter tersebut untuk menghilangkan makna khususnya: \[ atau \$ . Dalam Python metakarakter ‘\’ biasa diikuti berbagai karakter untuk mewakili berbagai set khusus. 
    • \d ekivalen dengan kelas [0-9]
      \D ekivalen dengan kelas [^0-9]
      \s ekivalen dengan kelas [\t\n\f\v\r]
      \S ekivalen dengan kelas [^\t\n\f\v\r]
      \w ekivalen dengan kelas [a-zA-Z0-9_]
      \W ekivalen dengan kelas [^a-zA-Z0-9_]

       

  • Metakarakter  . akan cocok dengan semua karakter kecuali karakter newline
  • Selanjutnya metakarakter  |  yang memiliki makna OR (atau). Misalnya ekpresi reguler A|B akan cocok dengan ‘A’ atau ‘B’.
  • metakarakter  *  yang digunakan untuk pengulangan karakter sebelum metakarakter ‘*’ sebanyak 0 kali atau lebih.
  • Misalnya ekspresi reguler cob*a akan cocok dengan ‘cob’(‘b’ 0 kali), ’coba’(‘b’ 1 kali), ’cobba’(‘b’ 2 kali) dst.
  • Berikutnya adalah metakarakter  + di mana fungsinya hampir sama dengan metakarakter ‘*’. Perbedaannya adalah di mana metakarakter ‘+’ hanya memperbolehkan pengulangan minimal 1 kali, sedangkan metakarakter ‘*’ memperbolehkan pengulangan 0 kali.
    • Misalnya ekspresi reguler di atas ditulis ulang menjadi cob+a, maka ekpresi tersebut hanya akan cocok dengan ‘coba’(‘b’ 1 kali), ‘cobba’(‘b’ 2 kali) dst.
  • Berikutnya adalah metakarakter  ? yang memperbolehkan pengulangan minimal 0 kali dan maksimal 1 sekali.
    • Misalnya ekspresi reguler cob?a akan cocok dengan ‘coa’ dan ‘coba’.
  • Metakarakter  { dan  } . Penggunaan kedua metakarakter di atas sering ditulis {m,n} di mana m menyatakan banyaknya pengulangan minimal dan n menyatakan banyaknya pengulangan maksimal.
    • Sebagai contoh ekspresi cob{1,3}a akan cocok dengan ‘coba’(‘b’ 1 kali),’cobba’(‘b’ 2 kali),’cobbba’(‘b’ 3 kali). Jika nilai m tidak disertakan, maka defaultnya adalah 0. Sedangkan jika nilai n tidak disertakan maka default-nya adalah tidak terhingga (tergantung kapasitas memory). Dengan demikian, maka ekspresi {0,} identik dengan metakarakter ‘*’ , ekspresi {1,} identik dengan metakarakter ‘+’ dan ekspresi {0,1} identik dengan metakarakter ‘?’ .
  • Dan yang terakhir adalah metakarakter ( dan  ) Kedua metakarakter ini digunakan untuk menyatakan grup karakter. Misalnya ekpresi reguler (coba){1,3} akan cocok dengan ‘coba’, ‘cobacoba’ dan ‘cobacobacoba’

Package Regular Expression

Setelah kalian pelajari metakaraketer diatas, selanjutnya kita akan membahas penerapan regular expression yaitu menggunakan R yang secara default sudah ada di package re. Modul ini sudah ada pada versi 1.5 yang re aslinya merupakan modul yang ditulis dalam bahasa C yang kemudian di-import ke dalam Python. Selanjutnya kita akan melihat bagaimana penerapan regex dengan bahasa Python.

Regular Expression pada Python dikompilasi menjadi suatu instansi objek yang menyediakan metode-metode seperti matching, searching dan replacing serta fungsi-fungsi manipulasi teks lainnya. Untuk memakai regex ini, kita harus mengompilasinya dengan metode compile() dan bila ingin digunakan lagi, maka kita tidak perlu mengompilasi ulang regex tersebut, kita tinggal memakainya. Berikut contohnya:

import re
pattern = re.compile("coba*")

Ekspresi reguler dilewatkan sebagai paramater string pada perintah  re.compile() . Ada satu hal yang perlu diperhatikan ketika menggunakan karakter ‘\’.

  1. Misalkan kita ingin melakukan pencocokan dengan string ‘\abc’ maka expresi reguler yang tepat adalah \\abc.
  2. Namun sewaktu kita mengompilasi expresi reguler tersebut, perintah yang benar adalah re.compile(‘\\\\abc’) mengingat tanda ‘\’ dalam string Python juga memiliki makna tersendiri sehingga perlu ditambahkan dua buah karakter ‘\’ lagi. Untuk mengatasi masalah ini kita dapat menggunakan raw strings dengan menambahkan awalan r pada ekspresi reguler. Jadi perintah di atas dapat ditulis menjadi re.compile(r’\\abc’).

Kita akan menggunakannya dalam contoh-contoh selanjutnya. Python menawarkan dua operasi regex yang mendasar yakni match() dan search(). Perbedaan di antara keduanya,

  1. yakni match() hanya melakukan pencocokan pada awal string (atau tidak sama sekali),
  2. sedangkan search() mencari dari awal sampai akhir string dan berhenti jika telah menemukan string pertama yang cocok dari sebelah kiri.

Untuk fungsi metode match() dan search() ketika menemukan string yang cocok akan mengembalikan objek Match. Jika tidak menemukan string yang cocok, maka akan mengembalikan objek None. Untuk jelasnya, mari kita lihat contoh

Operasi Match

import re
pat = re.compile(r'Python')
m = pat.match("Python")
print (m)
print(m.string)

hasilnya

<_sre.SRE_Match object; span=(0, 6), match='Python'>
Python

artinya ditemukan cocok mulai dari index 0 sampai 6 pada string Python, namun berikut ini akan  menghasilkan None karena tidak ada pada kalimat pertama!

m = pat.match("Java dan Python")
print (m)

Operasi Search

Kita akan coba menggunakan search

m = pat.search("Python")
print(m)

hasilnya

<_sre.SRE_Match object; span=(0, 6), match='Python'>

Validasi Alamat Email menggunakan Regex

Sekarang kita lanjutkan cara menggunakan meta karakter regex untuk validasi email

pat = re.compile(r'[\w.-]+@[\w.-]+')
while 1:
    email = input('Masukkan alamat email Anda : ')
    if pat.match(email):
        print ("Selamat, alamat email yang Anda  masukkan valid.")
        break
    else:
        print ("Maaf, alamat email yang Anda  masukkan tidak valid.")

Kode di atas bila dijalankan akan menghasilkan keluaran sebagai berikut:

Masukkan alamat email Anda : mulk#com
Maaf, alamat email yang Anda  masukkan tidak valid.

Masukkan alamat email Anda : softscients.com
Maaf, alamat email yang Anda  masukkan tidak valid.

Masukkan alamat email Anda : admin@softscients.com
Selamat, alamat email yang Anda  masukkan valid.

Atribut metode pada perintah Search

Objek Match yang dihasilkan dari penerapan perintah match() dan search() mempunyai atribut dan metode sendiri
juga. Anda dapat melihatnya dengan perintah dir()

import re

pat = re.compile(r'[A-Z]yth?on')
s = "Saya sedang belajar Python dan Jython"
m = pat.search(s)
print(m)

hasil

<_sre.SRE_Match object; span=(20, 26), match='Python'>

Kita cek langsung dengan perintah dir()

dir(m)

hasilnya

['__class__',
 '__copy__',
 '__deepcopy__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'end',
 'endpos',
 'expand',
 'group',
 'groupdict',
 'groups',
 'lastgroup',
 'lastindex',
 'pos',
 're',
 'regs',
 'span',
 'start',
 'string']

Beberapa metode yang sering digunakan adalah group(), start(), end() dan span(). Metode group() mengembalikan string yang cocok dengan pola yang kita inginkan. Metode start() mengembalikan nilai indeks awal string yang cocok, sedangkan metode end() mengembalikan nilai indeks akhir dari string yang cocok. Metode span() mengembalikan tuple yang berisi nilai indeks awal dan akhir dari string yang cocok.  Kita coba seperti berikut kode dan hasilnya

>>> m.group()
'Python'
>>> m.start(), m.end()
(20,26)
>>> m.span()
(20,26)

Metode search() akan berhenti jika telah menemukan satu string yang cocok, bila kita ingin menemukan semua string yang cocok maka kita dapat menggunakan metode findall(). Kalian juga dapat menggunakan metode finditer() untuk mendapatkan nilai indeks awal dan akhir dari setiap string yang cocok.

m = pat.findall(s)
print(m)

hasil kode regex python diatas yaitu

['Python', 'Jython']

ataupun kalian bisa menggunakan iterator

iterator = pat.finditer(s)
for it in iterator:
    print(it)

hasilnya

<_sre.SRE_Match object; span=(20, 26), match='Python'>
<_sre.SRE_Match object; span=(31, 37), match='Jython'>

Modifikasi string pada regular expression Python

Modul re juga mendukung fungsi-fungsi modifikasi string, seperti metode split(), sub(), dan subn(). Kita akan bahas satu-persatu

Metode Split

Metode split() pada modul re sebenarnya hampir sama dengan metode split() pada objek string. Metode split() pada modul re ini berfungsi memecah/membagi bagian-bagian string setiap terjadi kecocokan dengan ekpresi reguler dan menempatkannya dalam objek list dan nilai kembaliannya berupa objek list tersebut.

Metode split memiliki dua parameter.

  • Parameter pertama adalah objek string yang hendak dicocokkan dan
  • Parameter kedua bersifat optional untuk menandakan maksimum dibagi berapa bagian. Nilai default untuk parameter kedua ini adalah 0. Misalkan kita mengisi parameter kedua ini dengan nilai 2, maka akan dibagi menjadi dua bagian dan sisanya akan dijadikan satu serta ikut dimasukkan dalam objek list yang terbentuk. Berikut contohnya:
import re
pat = re.compile(r'\W+')
h = pat.split("Saya sedang belajar Python")
print(h)
h2 = pat.split("Saya sedang belajar Python",2)
print(h2)

hasilnya regex kode python diatas yaitu

['Saya', 'sedang', 'belajar', 'Python']
['Saya', 'sedang', 'belajar Python']

Kita coba lagi dengan mengubah meta karakternya

pat = re.compile(r'a\w+')
h3 = pat.split("Saya sedang belajar Python")
print(h3)

hasilnya

['S', ' sed', ' bel', ' Python']

coba lagi dengan kalimat lain

pat = re.compile(r'y')
h4 = pat.split("Python, Ruby dan Tcl")
print(h4)

hasil

['P', 'thon, Rub', ' dan Tcl']

Metode Sub

Metode sub() akan mengganti semua substring yang cocok dengan ekpresi reguler yang diberikan dengan string baru yang kita inginkan. Metode sub() juga memiliki tiga parameter.

  • Parameter pertama adalah string pengganti,
  • Parameter kedua berupa string yang hendak diganti dan
  • Parameter ketiga bersifat opsional untuk menandakan berapa kali akan terjadi pergantian string. Nilai default untuk parameter ketiga ini adalah 0 menandakan bahwa semua string yang cocok dengan ekspresi reguler akan diganti. Berikut contohnya:
pat = re.compile(r'((P|J)+\w*|Ru+\w*)')
s = "Saya belajar Python, Jython dan Ruby"
h = pat.sub("bahasa scripting",s)
print(h)

hasil

Saya belajar bahasa scripting, bahasa scripting dan bahasa scripting

kalau dimasukan dengan paramater berikut

h2 = pat.sub("bahasa scripting",s,2)
print(h2)

hasil

Saya belajar bahasa scripting, bahasa scripting dan Ruby

Metode Subn

Metode subn() sebenarnya sama dengan metode sub(). Hanya saja nilai kembalian dari metode subn() ini berupa sebuah tuple yang mengandung dua elemen, yakni string perubahan yang dihasilkan dan banyaknya pergantian yang terjadi. Berikut contohnya:

h3 = pat.subn("bahasa scripting",s)
print(h3)

hasil

('Saya belajar bahasa scripting, bahasa scripting dan bahasa scripting', 3)

Regular Expression memang menawarkan berbagai kemampuan manipulasi teks yang baik, akan tetapi juga mempunyai keterbatasan. Regular Expression mempunyai batasan di mana tidak bisa melakukan pattern-matching pada data yang bersarang dan bertingkat seperti pada HTML dan XML yang menggunakan sistem parsing. Adakalanya ada hal yang bisa dilakukan oleh regex, namun ekspresi regulernya akan menjadi sangat rumit. Bila hal tersebut terjadi, kalian lebih baik membuat sendiri fungsi tersebut dalam bahasa Python yang tentunya akan lebih mudah dimengerti. Dalam hal ini, tentunya Anda bisa memilih kapan kita membutuhkan regular expression. Setiap hal pasti memiliki kelebihan dan kekurangan masing-masing

ref:  www.infolinux.co.id

See also  Algoritma Sederhana untuk meringkas isi Artikel

Leave a Reply