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!
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