Python - Regular Expressions

Helo di sana, para penyihir Python masa depan! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia Regular Expressions (regex) di Python. Jangan khawatir jika anda belum pernah mendengar tentang regex sebelum ini - pada akhir tutorial ini, anda akan mengunakan alat ini yang kuat seperti seorang profesional!

Python - Reg Expressions

Apa itu Regular Expressions?

Sebelum kita kembali, mari kita faham apa itu regular expressions. Bayangkan anda adalah seorang detektif mencari pola khusus di atas laut teks. Regular expressions adalah seperti rakit penyemak anda, membantu anda mencari dan mengolah strings berdasarkan pola. Keren, kan?

Raw Strings

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

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

Dalam kasus pertama, anda akan melihat "Helo" dan "Dunia" di atas baris yang berbeda. Dalam kasus kedua, anda akan melihat "Helo\nDunia" seperti yang ada. Ini menjadi krusial ketika bekerja dengan pola regex.

Metacharacters

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

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

Fungsi re.match()

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

import re

hasil = re.match(r"Helo", "Helo, Dunia!")
if hasil:
print("Penyamahan ditemukan:", hasil.group())
else:
print("Tidak ada penyamahan")

Ini akan mencetak "Penyamahan ditemukan: Helo". Metode group() mengembalikan substring penyamahan.

Fungsi re.search()

Sementara re.match() mencari penyamahan di awal string, re.search() mengimbas keseluruhan string untuk penyamahan.

import re

hasil = re.search(r"Dunia", "Helo, Dunia!")
if hasil:
print("Penyamahan ditemukan:", hasil.group())
else:
print("Tidak ada penyamahan")

Ini akan mencetak "Penyamahan ditemukan: Dunia".

Pembandingan antara match() dan search()

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

Fungsi re.findall()

Fungsi re.findall() mengembalikan semua penyamahan 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() membuat 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 penyamahan untuk semua penyamahan non-overlapping pola di string.

import re

teks = "The rain in Spain"
for penyamahan in re.finditer(r"ain", teks):
print(f"Ditemukan '{penyamahan.group()}' di posisi {penyamahan.start()}-{penyamahan.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"
kata_vocal = re.findall(r'\b[aeiouAEIOU]\w+', teks)
print(kata_vocal)

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

Regular Expression Modifiers: Option Flags

Modul re Python menyediakan beberapa flag pilihan yang mengubah cara pola diinterpretasikan:

Flag Deskripsi
re.IGNORECASE (re.I) Melakukan penyamahan tak sensitif huruf
re.MULTILINE (re.M) Membuat ^ menyamai awal setiap baris dan $ akhir setiap baris
re.DOTALL (re.S) Membuat . menyamai setiap karakter, termasuk newline
re.VERBOSE (re.X) Memungkinkan anda menulis pola regex yang lebih mudah dibaca

Regular Expression Patterns

Mari kita eksplorasi beberapa pola yang lebih advance:

Character classes

Kelas karakter memungkinkan anda menentukan satu set karakter untuk menyamai:

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 vocal yang ditemukan di teks.

Special Character Classes

Regex Python mendukung kelas karakter khusus:

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

Repetition Cases

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'], menyamai nomor dengan 2 atau 3 digit.

Repetisi tak gizi

Secara default, repetisi adalah gizi, yang berarti ia menyamai sebanyak mungkin. Menambahkan ? setelah repetisi membuatnya tak gizi:

import re

teks = "<h1>Title</h1><p>Paragraph</p>"
gizi = re.findall(r"<.*>", teks)
tak_gizi = re.findall(r"<.*?>", teks)
print("Gizi:", gizi)
print("Tak gizi:", tak_gizi)

Ini akan menunjukkan perbedaan antara penyamahan gizi dan tak gizi.

Pengelompokan dengan Tanda Kurung

Tanda 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 mengekstrak nama dan email dari teks.

Backreferences

Backreferences memungkinkan anda untuk merujuk ke grup penyamahan sebelumnya:

import re

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

Ini menyamai tag HTML yang membuka dan menutup.

Alternatives

Karakter | memungkinkan anda untuk 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 menyamai "blue" atau "gray".

Anchors

Anchors menentukan posisi di teks:

import re

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

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

Special Syntax with Parentheses

Tanda kurung dapat digunakan untuk lebih dari sekedar pengelompokkan:

  • (?:...) membuat grup tak menangkap
  • (?P...) membuat grup bernama
  • (?=...) membuat lookahead positif
  • (?!...) membuat lookahead negatif
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 mengekstrak nomor versi, apakah "version" ada di teks atau tidak.

Dan itu adalah, folks! Kita telah melakukan perjalanan melalui wilayah Python regex, dari dasar-dasar ke beberapa konsep yang cukup advance. Ingat, seperti setiap alat 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