Regular Expression

Regular Expression


Regular expression (regex) ialah jejeran watak yang dipakai untuk penelusuran string atau text dengan memakai skema (pattern). Anda tentu akrab dengan penulisan e-mail, misalkan duniaprogramming1@gmail.com


Jika kita lihat, e-mail mempunyai skema : huruf / angka, dituruti oleh pertanda @, selanjutnya dituruti huruf, pertanda titik, dan huruf kembali. Sesudah ketahui skema dari e-mail, kita dapat cari potongan text mana yang terhitung e-mail dalam kelompok text yang banyak. Ucapkanlah kita ingin cari e-mail dalam 10 helai artikel yang mustahil kita susuri satu-satu lewat cara manual.


E-mail cuman salah satunya contoh. Sudah pasti, semua text mempunyai skema, dimulai dari nomor telepon, nomor KTP, tanggal, dan lain-lain.


Regex mempermudah kita cari string tertentu dari text yang banyak. Dengan regex, kita membuat skema lebih dulu. Selanjutnya kelak skema ini dicocokkan dengan text atau tulisan yang panjang. Jika ditemui string yang pas dengan skema, karena itu string itu juga dapat diekstrak atau diambil.


Python mempunyai modul re untuk lakukan hal - hal yang terkait dengan regex. Tetapi sebelumnya, kita harus pelajari lebih dulu langkah memakai regex ini.


Perbandingan Mencari Teks Tanpa Regex dan Dengan Regex


Berikut kita akan menyaksikan contoh bagaimana memperoleh nomor telepon tanpa regex, dan akan kita bandingkan dengan memakai regex.


Ucapkanlah nomor telepon rumah atau kantor ialah 10 digit, yakni 3 digit lokasi dituruti oleh spasi dan 7 digit nomor konsumen setia (kita misalnya ini cuman untuk kota besar yang mempunyai 3 digit code lokasi). Misalkan ialah nomor 061 7956411. Kita akan membuat suatu peranan is_phone_number() untuk memeriksa apa satu text ialah nomor telepon atau mungkin tidak.


Tanpa memakai reguler expression karena itu jadi ialah sebagai berikut:

def is_phone_number(text):

if len(text) != 11:

return False

for i in range(0, 3):

if not text[i].isdecimal():

return False

if text[3] != ' ':

return False

for i in range(4, 11):

if not text[i].isdecimal():

return False

return True

print('021 8229311 ialah nomor telephone:')

print(is_phone_number('021 8229311'))

print('Hello Hello ialah nomor telephone:')

print(is_phone_number('Hello Hello'))


Jika di lakukan, program di atas akan tampilkan hasil sebagai berikut:


021 8229311 ialah nomor telephone:

True

Hello Hello ialah nomor telephone:

False


Peranan is_phone_number() dapat kita gunakan untuk memperoleh beberapa nomor telephone yang berada di text sebagai berikut:

pesan = 'Panggil saya di nomor 061 7981011 esok. Jika sore dapat kontak kantor saya di 061 7939999.'

for i in range(len(pesan)):

teks = pesan[i:i+11]

if is_phone_number(text):

print("Nomor telephone diketemukan:", text)

print("usai ")


Saat digerakkan program di atas akan tampilkan hasil sebagai berikut:


Nomor telephone diketemukan: 061 7981011

Nomor telephone diketemukan: 061 7939999

usai


Kelihatan dari contoh, jika untuk memperoleh nomor telephone, kita membutuhkan banyak baris program. Ini benar-benar tidak efektif. Untuk menanganinya kita dapat memakai regex.


Menemukan Skema Teks Menggunakan Regular Expression


Program di atas cuman dapat dipakai untuk cari satu skema nomor telephone, tetapi telah memerlukan banyak baris program. Bagaimana kembali dengan skema nomor telepon yang lain seperti (061) 7956411 atau tanpa code wilayah 7956411? Program di atas akan tidak berhasil memverifikasi nomor telephone itu.


Regex ialah skema text. Misalkan untuk skema digit, kita memakai d . Maka misalkan skema untuk nomor telephone 061 7056123 kita dapat memakai ddd ddddddd. Kita dapat mempersingkat kembali skema itu sama yang lebih simpel yakni d{3} d{7} yang memiliki arti 3 digit dituruti spasi dan dituruti oleh 7 digit.


Membuat Objek Regex


Saat sebelum dapat membuat regex di Python lebih dulu kita impor modul re. Kesemua contoh di halaman ini, Anda harus lebih dulu mengimpor modul re.


impor re


Untuk membikin skema regex, kita memakai sistem compile() yang dipunyai oleh modul re. Sistem compile() ini akan kembalikan object regex. Object itu kita taruh dalam faktor untuk pemakaian seterusnya. Untuk contoh skema telephone awalnya di atas dapat kita bikin sebagai berikut:


nomor_telepon_regex = re.compile(r'ddd ddddddd)


Catatan: Kita seharusnya memakai watak raw string r di muka string dalam sistem compile() untuk menghindar watak escape. Jika tidak, karena itu kita harus menuliskan watak escape untuk watak-karakter khusus, misalkan pertanda . Maka ddd harus dibikin jadi \d\d\d.


Mencocokkan Objek Regex


Sesudah kita membuat object Regex, karena itu seterusnya kita bisa memakainya. Object regex yang kita bikin barusan mempunyai sistem search() yang dapat kita gunakan untuk cari text.


Jika tidak ada text yang diketemukan, karena itu sistem search() akan kembalikan None. Jika ada text yang sama sesuai skema, karena itu sistem ini akan kembalikan object Match. Object Match ini mempunyai sistem grup() yang berperan untuk kembalikan string sebetulnya yang sesuai skema barusan. Coba tuliskan code berikut di model interaktif IDLE atau cmd:


>>> nomor_telepon_regex = re.compile(r'ddd ddddddd')

>>> matching_object = nomor_telepon_regex.search('Nomor telephone saya: 061 7984611')

>>> print('Nomor telephone diketemukan: ' + mo.grup())


Output dari program di atas ialah sebagai berikut:


Nomor telepon ditemukan: 061 7984611


Pada contoh di atas, kita membuat object Regex atau skema nomor telephone memakai re.compile() dan menyimpan dalam faktor nomor_telepon_regex. Seterusnya kita panggil sistem search() yang dipunyai oleh object nomor_telepon_regex. Karena ada skema yang diketemukan, karena itu ada object Match yang dibuat. Kita taruh hasilnya di faktor match_object. Selanjutnya kita panggil sistem match_object.grup() yang hasilnya ialah nomor telephone yang diketemukan.


Rangkuman Pemakaian Regex di Python


Beberapa langkah pemakaian reguler expression di Python ialah seperti berikut:


1. Import modul reguler expression yakni dengan perintah impor re


2. Buat object Regex memakai sistem re.compile(). Janganlah lupa memakai raw string r


3. Terlewat string ke sistem search() yang dipunyai oleh object Regex. Hasilnya ialah object Match


4. Panggil sistem grup() yang dipunyai oleh object Match untuk memperoleh text yang tepat.


Pengelompokan Menggunakan Tanda Kurung ()


Misalnya pada nomor telephone 061 7954811, kita ingin pisahkan code tempat 061 dari nomor telephone bekasnya. Kita dapat membuat pengelompokan dengan skema (ddd) (ddddddd). Yang berada di dalam pertanda kurung pertama ialah grup 1 dan yang ke-2 berada di grup 2, dan sebagainya jika ada pertanda kurung kembali.


Seterusnya object string pada grup 1 dapat kita panggil memakai sistem grup() dengan argument nomor grup. Jika kita kosongkan argument-nya, karena itu yang bakal dibalikkan ialah string yang pas kesemuaannya. Untuk terangnya, tuliskan perintah - perintah berikut pada model interaktif IDLE:


>>> no_telp_regex = re.compile(r'(ddd) (ddddddd)')

>>> mo = no_telp_regex.search('Nomor telephone saya 021 8273467.')

>>> mo.grup()

'021 8273467'

>>> mo.grup(1)

'021'

>>> mo.grup(2)

'8273467'


Jika kita ingin memperoleh hasilnya sekalian di dalam 1 tuple, kita dapat memakai sistem grups(). Hasilnya dapat diletakkan dalam beberapa faktor dengan tehnik multipenugasan.


>>> mo.grups()

('021', '8273467')

>>> kode_area, no_telp = mo.grups()

>>> print(kode_area)

021

>>> print(no_telp)

8273467


Pertanda kurung mempunyai arti penting dalam regex. Jika aslinya yang ingin kita cocokkan ialah pertanda kurung, karena itu kita harus memakai watak escape yakni dengan pertanda.


>>> no_telp_regex = re.compile(r'((ddd)) (ddddddd)')

>>> mo = no_telp_regex.search('Nomor telephone saya (021) 8273467.')

>>> mo.grup(1)

'(021)'

>>> mo.grup(2)

'8273467'


Watak escape ( dan ) dalam re.compile() akan pas dengan watak pertanda kurung ( dan)


Menyamakan Beberapa Barisan Memakai Pertanda Pipa |


Kita dapat memakai pertanda pipa | untuk menyamakan beberapa gestur. Misalkan regex r'Superman|Spiderman' akan pas dengan string 'Superman' atau 'Spiderman'.


Jika ke-2 string Superman dan Spiderman berada di dalam string yang dicari, karena itu yang bakal dibalikkan ialah yang pertama kalinya ada. Lihat contoh berikut ini:


>>> hero_regex = re.compile(r'Superman|Spiderman')

>>> mo1 = hero_regex.search('Superman and Spiderman')

>>> mo1.grup()

'Superman'

>>> mo2 = hero_regex.search('Spiderman and Superman')

>>> mo2.grup()

'Spiderman'


Kita bisa juga memakai watak pipa untuk menyamakan satu dari beberapa skema. Misalkan, kita ingin menyamakan satu dari 'Batman', 'Batcopter', 'Batmobile'. Karena semua dengan diawali Bat, kita dapat memakai awalan Bat sekali dituruti dengan akhiran-akhirannya dalam pertanda kurung. Tuliskan perintah - perintah berikut di model interaktif:


>>> bat_regex = re.compile(r'Bat(man|copter|mobile|bat)')

>>> mo = bat_regex.search('Batcopter sedang rusak')

>>> mo.grup()

'Batcopter'

>>> mo.grup(1)

'copter'


Sistem mo.grup() kembalikan text ‘Batcopter', sedang mo.grup(1) cuman kembalikan 'copter' saja. Dengan memakai watak pipa dan pertanda kurung, kita dapat membuat beberapa skema opsi yang ingin dicocokkan.


Jika yang kita ingin cocokkan ialah watak | yang sebetulnya, karena itu kita harus memakai watak escape untuk pertanda pipa, yakni |.


Pencocokan 0 Atau Satu Kali Memakai Pertanda Bertanya ?


Tanda pertanyaan dapat dipakai untuk skema opsional. Tujuannya ialah stringnya dapat tidak ada atau ada. Dapat 0 kali atau 1 kali. Pertanda ? ditempatkan sesudah string atau grup string yang memiliki sifat opsional barusan. Untuk terangnya lihat contoh berikut ini:


>>> bat_regex = re.compile(r'Bat(wo)?man')

>>> mo1 = bat_regex.search('Ada Batman di Gotham city')

>>> mo1.grup()

'Batman'


>>> mo2 = bat_regex.search('Ada Batwoman di Gotham city')

>>> mo2.grup()

'Batwoman'


Sisi (wo)? pada contoh di atas maknanya jika wo ialah opsional. Dapat tidak ada wo, atau dapat ada satu wo. Oleh karenanya r'Bat(wo)?man' akan pas dengan ‘Batman' atau ‘Batwoman'.


Untuk contoh nomor telephone, misalkan code tempatnya ialah opsional, karena itu kita dapat melakukan sebagai berikut:


>>> no_telp_regex = re.compile(r'(ddd)?dddd')

>>> mo1 = no_telp_regex.search('Nomor telephone saya 021 8273467')

>>> mo1.grup()

021 8273467


>>> mo2 = no_telp_regex.search('Nomor telephone saya ialah 8273467')

>>> mo2.grup()

'8273467'


Jika yang kita ingin cocokkan ialah watak ? yang sebetulnya, karena itu kita harus memakai watak escape untuk tanda pertanyaan, yakni ?.


Pencocokan 0, Satu Atau Beberapa Kali Memakai Pertanda Bintang *


Pertanda bintang * ialah watak khusus yang dipakai untuk membikin pencocokan 0 kali, satu, atau seringkali munculnya string. Misalnya ialah sebagai berikut:


>>> bat_regex = re.compile(r'Bat(wo)*man')

>>> mo1 = bat_regex.search('Ada Batman di Gotham city')

>>> mo1.grup()

'Batman'


>>> mo2 = bat_regex.search('Ada Batwoman di Gotham city')

>>> mo2.grup()

'Batwoman'


>>> mo3 = bat_regex.search('Ada Batman di Gotham city')

>>> mo3.grup()

'Batwowowoman'


Lihat jika (wo)* pas dengan pengulangan wo berapakah kali juga, hingga r'Bat(wo)*man' akan pas dengan ‘Batman', ‘Batwoman', ‘Batwowoman', ‘Batwowowowoman', dan sebagainya.


Jika yang kita ingin cocokkan ialah watak * yang sebetulnya, karena itu kita harus memakai watak escape untuk pertanda bintang, yakni *.


Pencocokan Satu Atau Beberapa Kali Memakai Pertanda Lebih +


Pertanda lebih + dipakai untuk skema 1x atau lebih. Keberadaannya harus ada minimum 1x. Lihat contoh berikut ini:


>>> bat_regex = re.compile(r'Bat(wo)+man')

>>> mo1 = bat_regex.search('Ada Batwoman di Gotham city')

>>> mo1.grup()

'Batwoman'


>>> mo2 = bat_regex.search('Ada Batwowowoman di Gotham city')

>>> mo2.grup()

'Batwowowoman'


Regex r'Bat(wo)+man tidak pas dengan ‘Batman' karena harus ada minimum satu wo didalamnya.


Jika yang kita ingin cocokkan ialah watak + yang sebetulnya, karena itu kita harus memakai watak escape untuk pertanda lebih, yakni +.


Skema Berulang-ulang Memakai Pertanda Kurung Kurawal { }


Kita dapat memakai pertanda kurung kurawal untuk membikin skema berulang-ulang. Misalkan, regex r'(He){3}' akan sesuai string 'HeHeHe' tetapi tidak pas dengan 'He' atau 'HeHe'.


Kita bisa juga atur pengulangannya berapakah kali, berapakah minimal dan maksimalnya. Regex r'(He){2,5}' akan pas dengan ‘HeHe', ‘HeHeHe', ‘HeHeHeHe', dan ‘HeHeHeHeHe'.


Disamping itu, kita bisa juga kosongkan angka depan atau belakangnya. Regex r'(He){,4} akan pas dengan 0 sampai 4 kali He, sedang r'(He){3,} akan pas dengan 3 ataupun lebih He.


Lihat contoh berikut ini:


>>> he_regex = re.compile(r'(He){3}')

>>> mo1 = he_regex.search('HeHeHe')

>>> mo1.grup()

'HeHeHe'


>>> mo2 = he_regex.search('He')

>>> mo2 == None

True


Pada contoh di atas, (He){3} pas dengan 'HeHeHe', tetapi tidak dengan ‘He'. Karena tidak pas dengan 'He', karena itu dari hasil mo2 ialah nilai None.


Skema Rakus dan Tidak Rakus


Regex pada Python secara standar memiliki sifat rakus (greedy). Maknanya, dalam dua ataupun lebih keadaan yang sama sesuai, karena itu regex akan pilih string yang paling panjang. Untuk terangnya mengenai ini, lihat contoh berikut ini:


>>> rakus_regex = re.compile(r'(He){3,5}')

>>> mo = rakus_regex.search('HeHeHeHeHe')

>>> mo.grup()

'HeHeHeHeHe'


Dari contoh di atas, dapat dipandang jika object Match kembalikan ‘HeHeHeHeHe' dan bukan ‘HeHeHe', walau sebenarnya ‘HeHeHe' ialah yang pertama pas dengan skema.


Untuk membikin regex memiliki sifat tidak rakus (non greedy) atau pilih kesesuaian string yang pertama, kita dapat memakai tanda pertanyaan di ujung dari grup regex. Lihat contoh berikut ini:


>>> rakus_regex = re.compile(r'(He){3,5}?')

>>> mo = rakus_regex.search('HeHeHeHeHe')

>>> mo.grup()

'HeHeHe'


Pada contoh di atas kelihatan, jika dengan menambah tanda pertanyaan di ujung pengulangan regex, kita dapat menahan karakter rakus dari regex. Harus diingat jika tanda pertanyaan selainnya untuk menahan karakter rakus regex, bisa juga dipakai untuk pencocokan opsional 0 atau 1x seperti telah diterangkan awalnya.


Sistem findall()


Awalnya, kita cuman memakai sistem search() untuk pencocokan. Jika misalkan ada banyak string yang pas, karena itu sistem search() cuman kembalikan kesesuaian yang pertama kalinya ditemui pada string. Lihat contoh berikut


>>> no_telp_regex = re.compile(r'd{3} d{7}')

>>> string = 'Rumah: 021 8237371 Kantor: 021 8237432'

>>> mo1 = no_telp_regex.search(string)

>>> mo1.grup()

'021 8237371'


Jika kita ingin memperoleh semua string yang pas, karena itu kita dapat memakai sistem findall(). Sistem ini akan kembalikan daftar yang berisi semua string pas yang diketemukan - asal tidak ada grup dalam regexnya. Jika ada grup dalam regexnya, karena itu sistem findall() akan kembalikan daftar berisi tuple dari setiap group string. Untuk terangnya lihat contoh berikut ini:


>>> string = 'Rumah: 021 8237371 Kantor: 021 8237432'

>>> no_telp_regex = re.compile(r'd{3} d{7}') #tanpa group

>>> mo = no_telp_regex.findall(string)

>>> mo

['021 8237371', '021 8237432']


>>> no_telp_regex = re.compile(r'(d{3}) (d{7})') #dengan group

>>> mo = no_telp_regex.findall(string)

>>> mo

[('021', '8237371'), ('021', '8237432')


Kelas Watak


Dari contoh - contoh awalnya, kita sudah tahu jika d sebagai skema untuk sebuah digit. Oleh karenanya d ialah alternatif dari regex (0|1|2|3|4|5|6|7|8|9). Regex d ialah contoh dari kelas watak. Kelas watak dipakai sebagai shortcut dari skema regex. Python banyak memiliki kelas watak, seperti diperlihatkan oleh tabel berikut ini:

Kelas Watak Karakter Yang Dicontohkan

d Digit atau angka dari 0 s/d 9

D Semua watak selainnya digit 0 s/d 9

w Semua huruf, digit, dan watak underscore (_)

W Semua watak selainnya huruf, digit, dan underscore

s Spasi, tab, dan watak newline (baris baru)

S Karakter selainnya spasi, tab, atau newline


Misalnya regex r'd+sw+' akan sesuai satu atau beberapa digit (d+) - dituruti satu spasi atau tab (s) - dan dituruti oleh watak huruf, digit, atau underscore (w+).


>>> sesuatu_regex = re.compile(r'd+sw+')

>>> sesuatu_regex.findall('11 sepeda, 10 mobil, 9 pesawat, 8 computer, 7 smartphone')

['11 sepeda', '10 mobil', '9 pesawat', '8 komputer', '7 smartphone'


Pada contoh di atas, sistem findall() kembalikan daftar yang berisi semua string yang pas dengan regex.


Membuat Watak Kelas Sendiri


Kita dapat mendeskripsikan kelas watak kita sendiri untuk dipakai pada regex. Kita mendeskripsikan kelas watak yang kita harapkan dalam pertanda [ ]. Misalnya [aiueoAIUEO] akan pas dengan semua huruf vocal baik kecil atau besar. Lihat contoh berikut ini:


>>> vokal_regex = re.compile(r'[aiueoAIUEO]')

>>> vokal_regex.findall('Learning Python is VERY FUN')

['e', 'a', 'i', 'o', 'i', 'E', 'U']


Kelas watak [a-z] akan sesuai semua huruf kecil dari a sampai z.


Kelas watak [a-zA-Z] akan sesuai semua huruf baik besar atau kecil.


Kelas watak [a-zA-Z0-9] akan sesuai semua huruf dan digit.


Untuk watak - watak kontrol seperti +,., *, atau () dibikin apa yang ada (tidak memakai pertanda watak escape ). Kelas watak[0-5.*] akan sesuai digit 0 sampai 5 dan pertanda titik. dan pertanda bintang *. Kelas watak [a-h()] akan sesuai huruf a sampai h dan pertanda kurung ( dan ).


Kita bisa juga membuat kontradiksi atau negasi dari kelas watak dengan memakai pertanda caret (^) sesudah pertanda pembuka [. Misalkan [^aiueoAIUEO] akan sesuai semua watak yang bukan vocal, mirip contoh di bawah ini.


>>> konsonan_regex = re.compile(r'[^aiueoAIUEO]')

>>> konsonan_regex.findall('Learning Python is VERY FUN')

['L', 'r', 'n', 'n', 'g', ' ', 'P', 'y', 't', 'h', 'n', ' ', 's', ' ', 'V', 'R', 'Y', ' ', 'F', 'N']


Posting Komentar

Lebih baru Lebih lama

نموذج الاتصال