Python - Regular Expressions (Indonesia)

Halo there, masa depan jinaks Python! Hari ini, kita akan memulai perjalanan yang menarik ke dunia Regular Expressions (regex) di Python. Jangan khawatir jika Anda belum pernah mendengar tentang regex sebelumnya - pada akhir tutorial ini, Anda akan menguasai alat yang kuat ini seperti seorang pro!

Python - Reg Expressions

Apa itu Regular Expressions?

Sebelum kita melompat masuk, mari kita mengerti apa itu regular expressions. Bayangkan Anda adalah detektif yang mencari pola spesifik di atas lautan teks. Regular expressions adalah seperti kaca pembesar Anda, membantu Anda mencari dan mengolah string berdasarkan pola. Keren, kan?

Raw Strings

Di Python, ketika bekerja dengan regex, kita sering menggunakan raw strings. Ini adalah string yang diawali dengan 'r' dan memperlakukan backslashes sebagai karakter literal. Ini sangat berguna dalam regex karena backslashes adalah umum.

# String normal
print("Halo\nDunia")
# Raw string
print(r"Halo\nDunia")

Pada kasus pertama, Anda akan melihat "Halo" dan "Dunia" pada baris terpisah. Pada kasus kedua, Anda akan melihat "Halo\nDunia" seperti biasa. Ini menjadi krusial ketika bekerja dengan pola regex.

Metacharacters

Metacharacters adalah blok penyusun dari regex. Mereka memiliki arti khusus dan membantu kita mendefinisikan pola. Mari kita lihat beberapa yang umum:

Metacharacter Arti
. Cocokkan setiap karakter kecuali newline
^ Cocokkan awal string
$ Cocokkan akhir string
* Cocokkan 0 atau lebih pengulangan
+ Cocokkan 1 atau lebih pengulangan
? Cocokkan 0 atau 1 pengulangan
{} Cocokkan jumlah pengulangan yang ditentukan secara eksplisit
[] Menentukan sekumpulan karakter untuk dicocokkan
\ Menghindari karakter khusus

Fungsi re.match()

Fungsi re.match() berusaha untuk mencocokkan pola di awal string. Jika menemukan kecocokan, itu mengembalikan objek kecocokan; jika tidak, itu mengembalikan None.

import re

hasil = re.match(r"Halo", "Halo, Dunia!")
if hasil:
print("Kecocokan ditemukan:", hasil.group())
else:
print("Tidak ada kecocokan")

Ini akan mencetak "Kecocokan ditemukan: Halo". Metode group() mengembalikan substring yang cocok.

Fungsi re.search()

Sementara re.match() mencari kecocokan di awal string, re.search() menggeser keseluruhan string untuk mencari kecocokan.

import re

hasil = re.search(r"Dunia", "Halo, Dunia!")
if hasil:
print("Kecocokan ditemukan:", hasil.group())
else:
print("Tidak ada kecocokan")

Ini akan mencetak "Kecocokan ditemukan: Dunia".

Pencocokan Vs Pencarian

Perbedaan utama antara match() dan search() adalah bahwa match() hanya memeriksa kecocokan di awal string, sedangkan search() memeriksa kecocokan di mana saja di string.

Fungsi re.findall()

Fungsi re.findall() mengembalikan semua kecocokan non-overlapping dari pola di string sebagai daftar.

import re

teks = "The rain in Spain falls mainly in the plain"
hasil = re.findall(r"ain", teks)
print(hasil)

Ini akan mencetak ['ain', 'ain', 'ain'].

Fungsi re.sub()

Fungsi re.sub() mengganti semua kemunculan pola di string dengan string pengganti.

import re

teks = "The rain in Spain"
hasil = re.sub(r"a", "o", teks)
print(hasil)

Ini akan mencetak "The roin in Spoin".

Fungsi re.compile()

Fungsi re.compile() menciptakan objek regex untuk penggunaan ulang, yang dapat lebih efisien jika Anda menggunakan pola yang sama beberapa kali.

import re

pola = re.compile(r"\d+")
hasil1 = pola.findall("There are 123 apples and 456 oranges")
hasil2 = pola.findall("I have 789 bananas")

print(hasil1)
print(hasil2)

Ini akan mencetak ['123', '456'] dan ['789'].

Fungsi re.finditer()

Fungsi re.finditer() mengembalikan wadah yang menghasilkan objek kecocokan untuk semua kecocokan non-overlapping pola di string.

import re

teks = "The rain in Spain"
for kecocokan in re.finditer(r"ain", teks):
print(f"Ditemukan '{kecocokan.group()}' di posisi {kecocokan.start()}-{kecocokan.end()}")

Ini akan mencetak:

Ditemukan 'ain' di posisi 5-8
Ditemukan 'ain' di posisi 17-20

Penggunaan Kasus Python Regex

Regular expressions memiliki banyak aplikasi praktis. Mari kita lihat kasus penggunaan umum:

Mencari kata yang dimulai dengan huruf vocal

import re

teks = "An apple a day keeps the doctor away"
huruf_vokal = re.findall(r'\b[aeiouAEIOU]\w+', teks)
print(huruf_vokal)

Ini akan mencetak ['An', 'apple', 'a', 'away'].

Regular Expression Modifiers: Option Flags

Modul re Python menyediakan beberapa flag opsi yang mengubah bagaimana pola diinterpretasikan:

Flag Deskripsi
re.IGNORECASE (re.I) Melakukan pencocokan tak sensitif huruf besar/kecil
re.MULTILINE (re.M) Membuat ^ mencocokkan awal setiap baris dan $ akhir setiap baris
re.DOTALL (re.S) Membuat . mencocokkan setiap karakter, termasuk newline
re.VERBOSE (re.X) Memungkinkan Anda menulis pola regex yang lebih dapat dibaca

Regular Expression Patterns

Mari kita jelajahi beberapa pola yang lebih tingkat lanjut:

Kelas Karakter

Kelas karakter memungkinkan Anda menentukan sekumpulan karakter untuk dicocokkan:

import re

teks = "The quick brown fox jumps over the lazy dog"
hasil = re.findall(r"[aeiou]", teks)
print(hasil)

Ini akan mencetak semua huruf vokal yang ditemukan di teks.

Kelas Karakter Khusus

Python regex mendukung kelas karakter khusus:

Class Deskripsi
\d Mencocokkan setiap digit desimal
\D Mencocokkan setiap karakter non-digit
\s Mencocokkan setiap karakter whitespace
\S Mencocokkan setiap karakter non-whitespace
\w Mencocokkan setiap karakter alfanumerik
\W Mencocokkan setiap karakter non-alfanumerik

Kasus Pengulangan

Kita dapat menentukan berapa kali pola harus muncul:

import re

teks = "I have 111 apples and 22 oranges"
hasil = re.findall(r"\d{2,3}", teks)
print(hasil)

Ini akan mencetak ['111', '22'], mencocokkan nomor dengan 2 atau 3 digit.

Pengulangan Tak Ganas

Dengan default, pengulangan adalah ganas, yang berarti itu mencocokkan sebanyak mungkin. Menambahkan ? setelah pengulangan membuatnya tak ganas:

import re

teks = "<h1>Title</h1><p>Paragraph</p>"
ganas = re.findall(r"<.*>", teks)
tak_ganas = re.findall(r"<.*?>", teks)
print("Ganas:", ganas)
print("Tak ganas:", tak_ganas)

Ini akan menunjukkan perbedaan antara pengulangan ganas dan tak ganas.

Penggunaan Kurung untuk Gruping

Kurung memungkinkan Anda untuk mengelompokkan bagian dari regex:

import re

teks = "John Smith ([email protected])"
hasil = re.search(r"(\w+) (\w+) \((\w+@\w+\.\w+)\)", teks)
if hasil:
print(f"Full Name: {hasil.group(1)} {hasil.group(2)}")
print(f"Email: {hasil.group(3)}")

Ini meng ekstrak nama dan email dari teks.

Backreferences

Backreferences memungkinkan Anda mengacu ke grup yang sudah dicocokkan sebelumnya:

import re

teks = "<h1>Title</h1><p>Paragraph</p>"
hasil = re.findall(r"<(\w+)>.*?</\1>", teks)
print(hasil)

Ini mencocokkan tag HTML yang membuka dan menutup.

Alternatif

Karakter | memungkinkan Anda menentukan alternatif:

import re

teks = "The color of the sky is blue or gray"
hasil = re.search(r"blue|gray", teks)
if hasil:
print(f"Found color: {hasil.group()}")

Ini mencocokkan "blue" atau "gray".

Penyangga

Penyangga menentukan posisi di teks:

import re

teks = "Python is awesome"
awal = re.match(r"^Python", teks)
akhir = re.search(r"awesome$", teks)
print(f"Starts with Python: {bool(awal)}")
print(f"Ends with awesome: {bool(akhir)}")

Ini memeriksa jika teks dimulai dengan "Python" dan diakhiri dengan "awesome".

Sintaks Khusus dengan Kurung

Kurung dapat digunakan untuk lebih dari sekedar pengelompokkan:

  • (?:...) membuat grup non-capturing
  • (?P...) membuat grup dengan nama
  • (?=...) membuat positive lookahead
  • (?!...) membuat negative lookahead
import re

teks = "Python version 3.9.5"
hasil = re.search(r"Python (?:version )?(?P<version>\d+\.\d+\.\d+)", teks)
if hasil:
print(f"Version: {hasil.group('version')}")

Ini meng ekstrak nomor versi, apakah "version" ada di teks atau tidak.

Dan itu sudah semua, folks! Kita telah melakukan perjalanan melalui negeri Python regex, dari dasar-dasar ke konsep yang quiet advance. Ingat, seperti setiap alat yang kuat, regex memerlukan praktek untuk menguasainya. Jadi jangan kesusahan jika itu terasa menantang di awal. Tetap eksperimen, dan segera Anda akan mencari pola seperti detektif pro! Happy coding!

Credits: Image by storyset