Ekspresi reguler Python dengan contoh
- 2731
- 849
- Ian Parker
Ekspresi reguler (sering disingkat menjadi "regex") adalah teknik, dan pola tekstual, yang mendefinisikan bagaimana seseorang ingin mencari atau memodifikasi string yang diberikan. Ekspresi reguler biasanya digunakan dalam skrip shell bash dan dalam kode Python, serta dalam berbagai bahasa pemrograman lainnya.
Dalam tutorial ini Anda akan belajar:
- Cara Memulai dengan Ekspresi Reguler di Python
- Cara mengimpor modul regex python
- Cara mencocokkan string dan karakter menggunakan notasi regex
- Cara menggunakan notasi python regex yang paling umum
Persyaratan dan konvensi perangkat lunak yang digunakan
Kategori | Persyaratan, konvensi atau versi perangkat lunak yang digunakan |
---|---|
Sistem | Sistem operasi GNU/Linux apa pun |
Perangkat lunak | Python 2, Python 3 |
Lainnya | Akses istimewa ke sistem Linux Anda sebagai root atau melalui sudo memerintah. |
Konvensi | # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa |
Contoh Ekspresi Reguler Python
Di Python, seseorang ingin mengimpor ulang
modul untuk memungkinkan penggunaan ekspresi reguler.
Contoh 1 Mari kita mulai dengan contoh sederhana:
$ python3 python 3.8.2 (default, 27 Apr 2020, 15:53:34) [GCC 9.3.0] pada jenis linux "bantuan", "hak cipta", "kredit" atau "lisensi" untuk informasi lebih lanjut. >>> cetak ('halo dunia') halo dunia >>> impor re >>> cetak (re.cocok ('^.','Halo Dunia'))
Menyalin Di sini kami pertama kali mencetak Halo Dunia
Baris 5 untuk menunjukkan pengaturan cetak sederhana. Kami kemudian mengimpor modul regex ulang
Baris 7 Mengenakan kami untuk menggunakan .cocok
Fungsi Line Ekspresi Reguler 8Matching dari Perpustakaan itu.
Sintaksis .cocok
Fungsi adalah (pola, string) di mana pola didefinisikan sebagai ekspresi reguler ^.
'Dan kami menggunakan hal yang sama Halo Dunia
string sebagai string input kami.
Seperti yang Anda lihat, kecocokan ditemukan dalam surat itu H
. Alasan kecocokan ini ditemukan adalah pola ekspresi reguler, yaitu; ^
berdiri untuk Mulai dari string Dan .
berdiri untuk Cocokkan satu karakter (kecuali newline).
Dengan demikian, H
ditemukan, karena surat itu langsung setelah "awal string", dan digambarkan sebagai "satu karakter, H
pada kasus ini".
Konotasi khusus ini identik dengan ekspresi reguler dalam skrip bash, dan aplikasi Regex-Aware lainnya, yang semuanya menggunakan standar regex seragam yang lebih atau kurang, meskipun ada perbedaan antara bahasa dan bahkan implementasi spesifik jika Anda menggali sedikit ekspresi reguler sedikit sedikit. lebih jauh.
Contoh 2
>>> Cetak (RE.cocok ('... w', 'halo dunia'))
Menyalin Di sini kami menggunakannya .
untuk mencocokkan satu karakter (kecuali newline) dan kami melakukan ini 6 kali sebelum mencocokkan karakter literal W
.
Seperti yang Anda lihat Halo w
(7 karakter) dicocokkan. Menariknya, pertunjukan ini sebagai rentang (0,7) yang tidak boleh dibaca sebagai 0-7 (yaitu 8 karakter) tetapi sebagai "mulai dari 0" "+7 karakter", seperti juga dapat dilirik dari contoh lain dalam hal ini artikel.
Contoh 3 Mari kita ambil contoh yang lain, sedikit lebih kompleks:
>>> Cetak (RE.cocok ('^h [elo]+', 'hello world'))
Menyalin Sintaks dalam kasus ini adalah:
- ^: seperti dijelaskan di atas, juga dapat dibaca sebagai 'ini harus menjadi awal dari string'
- H: harus cocok
H
Di lokasi yang tepat ini (yang langsung setelah/pada awal string) - [ELO]+: Cocokkan juga
e
,l
atauHai
('baik' yang ditentukan oleh[' Dan ']
) Dan+
berarti 'satu atau lebih dari ini'
Dengan demikian, Halo
dicocokkan sebagai H
memang di awal string, dan e
Dan Hai
Dan l
dicocokkan satu atau lebih kali (dalam urutan apa pun).
Contoh 3 sudah siap untuk yang super kompleks?
>>> Cetak (RE.findAll ('^[he]+ll [o \ t]+wo [rl].+$ ',' Hello World ')) [' Hello World '];
Menyalin Di sini kami menggunakan fungsi lain dari modul RE, yaitu Temukan semua
yang segera menghasilkan string yang ditemukan dan menggunakan sintaks (pola, string) yang sama.
Mengapa Halo Dunia
cocok secara penuh? Mari kita hancurkan langkah demi langkah:
- ^: Mulai dari string
- [Dia]+: Cocok
H
Dane
1 kali atau lebih, dan dengan demikianDia
dicocokkan - II: pencocokan literal
II
di tempat yang tepat ini, dan dengan demikian memangII
dicocokkan karena datang langsung setelahnyaDia
- [o \ t]+: Cocokkan juga
"
(ruang), atauHai
, atau\T
(tab), dan itu 1 kali atau lebih, dan dengan demikianHai
(O Space) cocok. Jika kami menggunakan tab sebagai ganti ruang, regex ini masih akan berfungsi! - Wo: Kecocokan literal
Wo
- [RL]: Cocokkan juga
R
ataul
. Perhatikan baik -baik; hanyaR
dicocokkan di sini! Tidak ada+
dibalik]
Jadi hanya satu karakter, keduanyaR
ataul
akan dicocokkan di posisi ini. Jadi mengapaRld
masih cocok? Jawabannya ada di kualifikasi berikutnya; - .+: Cocokkan karakter apa pun (ditandai oleh
.
) satu atau lebih kali, dengan demikianl
DanD
keduanya cocok, dan string kami selesai - $: Mirip dengan
^
, Karakter ini menandakan "akhir string".
Dengan kata lain, apakah kami menempatkan ini di awal, atau di tempat lain di tengah, regex akan tidak cocok.
Sebagai contoh:
>>> Cetak (RE.findAll ('^hello $', 'hello world')) [] >>> cetak (re.findAll ('^hello $', 'hello')) [] >>> cetak (re.findAll ('^hello $', 'hello')) ['hello'] >>> cetak (re.findAll ('^halo', 'halo dunia')) ['halo']
Menyalin Di sini tidak ada output yang dikembalikan untuk dua cetakan pertama, karena kami mencoba mencocokkan string yang dapat dibaca sebagai "start_of_string"-Halo
-“End_of_string” sebagaimana ditandai oleh ^Halo $
, melawan Halo Dunia
Yang tidak cocok.
Dalam contoh ketiga, ^Halo $
pertandingan Halo
Karena tidak ada karakter tambahan di Halo
string yang akan menyebabkan regex ini gagal mencocokkan. Akhirnya, contoh terakhir menunjukkan kecocokan parsial tanpa persyaratan untuk "end_of_string" ($) terjadi.
Melihat? Anda sudah menjadi ahli ekspresi reguler! Ekspresi reguler bisa menyenangkan, dan sangat kuat!
Contoh 4
Ada berbagai fungsi lain di ulang
Modul python, seperti ulang.sub, ulang.membelah, ulang.subn, ulang.mencari, masing -masing dengan domain kasus penggunaan yang berlaku. Mari kita lihat RE.sub selanjutnya:
>>> Cetak (RE.sub ('^halo', 'bye bye', 'hello world')) bye bye world
Menyalin Substitusi String adalah salah satu aplikasi paling kuat dari ekspresi reguler, dalam Python dan bahasa pengkodean lainnya. Dalam contoh ini, kami mencari ^Halo
dan menggantinya dengan Sampai jumpa
di string Halo Dunia
. Dapatkah Anda melihat bagaimana ini akan sangat berguna untuk memproses semua jenis variabel dan string teks dan bahkan seluruh file teks datar?
Contoh 5
Mari kita lihat beberapa contoh yang lebih kompleks, menggunakan sintaks Regex yang lebih canggih:
>>> Cetak (RE.sub ('[0-9]+', '_', 'halo dunia 123')) halo dunia _
Menyalin - [0-9]+: Karakter numerik apa pun dari
0
ke9
, satu kali atau lebih.
Dapatkah Anda melihat bagaimana 123
digantikan oleh satu _
?
Contoh 6
>>> Cetak (RE.sub('(?i) [o-r]+',' _ ',' halo dunia 123 ')) hell_ w_ld 123
Menyalin - (?i) [o-r]+: Cocokkan satu atau lebih
HAI
keR
atau - terima kasih untuk opsionalSaya
bendera -Hai
keR
- (?Saya): preset case-tidak sensitif
Saya
Bendera untuk pola ini
>>> Cetak (RE.sub ('[1] 2', '_', 'halo dunia 111')) halo dunia _1
Menyalin - [1] 2: Cocokkan karakternya
1
Tepat dua kali
Contoh 7
>>> Cetak (RE.sub ('(dunia)', '\ g \ g', 'halo dunia 123')) halo worldworld 123
Menyalin - (Dunia): Cocokkan teks literal 'dunia' dan jadikan itu kelompok yang kemudian dapat digunakan dalam substitusi
- \ g \ g: The
\G
Menentukan grup pertama yang cocok, saya.e. teksDunia
diambil dariHalo Dunia 123
string, dan ini diulangi dua kali, menghasilkanDunia Dunia
keluaran. /li>
Contoh 8
Untuk membuat ini lebih jelas, pertimbangkan dua contoh berikut:
>>> Cetak (RE.sub ('(o)', '\ g \ g \ g', 'halo dunia 123')) hellooo wooorld 123
Menyalin Dalam contoh pertama ini, kami cocok Hai
dan letakkan di dalam kelompok, lalu ulangi kelompok itu tiga kali di luar.
Perhatikan bahwa jika kita tidak akan merujuk ke Grup 1 (grup yang dicocokkan pertama, contoh kedua), maka tidak akan ada output dan hasilnya adalah:
>>> Cetak (RE.sub ('(o)', ", 'halo dunia 123')) neraka wrld 123
Menyalin Untuk contoh kedua, pertimbangkan:
>>> Cetak (RE.sub ('(o).*(r) ',' \ g \ g ',' halo dunia 123 ')) Hellorld 123
Menyalin Di sini kami memiliki dua kelompok, yang pertama Hai
(Di mana pun kelompok seperti itu cocok dengan, dan jelas ada banyak seperti yang terlihat pada contoh pertama), dan yang kedua R
. Selain itu, kami menggunakan .*
yang diterjemahkan menjadi "karakter apa pun, beberapa kali" - ekspresi reguler yang sering digunakan.
Jadi dalam contoh ini o wor
dicocokkan oleh (Hai).*(r) '(' o
Pertama, lalu karakter apa pun sampai yang terakhir R
tercapai. Gagasan "terakhir" sangat impor dan mudah membuat kesalahan/gotcha, terutama untuk pengguna ekspresi reguler baru. Sebagai contoh sisi, pertimbangkan:
>>> Cetak (RE.sub ('e.*o ',' _ ',' halo dunia 123 ')) h_rld 123
Menyalin Dapatkah Anda melihat bagaimana yang terakhir Hai
dicocokkan?
Kembali ke contoh kami:
>>> Cetak (RE.sub ('(o).*(r) ',' \ g \ g ',' halo dunia 123 ')) Hellorld 123
Menyalin Kita bisa melihat itu o wor
digantikan oleh pertandingan Grup 1 diikuti oleh pertandingan Grup 2, menghasilkan: o wor
digantikan oleh atau
dan dengan demikian outputnya Hellorld 123
.
Kesimpulan
Mari kita lihat beberapa notasi ekspresi reguler yang lebih umum tersedia di Python, cocok dengan beberapa implementasi ringan yang sama:
Notasi Regex | Keterangan |
---|---|
. | Karakter apa pun, kecuali newline |
[A-C] | Salah satu karakter dari rentang yang dipilih, dalam hal ini A, B, C |
[A-z] | Salah satu karakter dari kisaran yang dipilih, dalam hal ini A-Z |
[0-9AF-Z] | Salah satu karakter dari rentang yang dipilih, dalam hal ini 0-9, A, dan F-Z |
[^A-za-z] | Satu karakter di luar kisaran yang dipilih, dalam hal ini misalnya '1' akan memenuhi syarat |
* | Sejumlah kecocokan (0 atau lebih) |
+ | 1 pertandingan atau lebih |
? | 0 atau 1 pertandingan |
3 | Tepat 3 pertandingan |
() | Grup penangkapan. Pertama kali ini digunakan, nomor grup adalah 1, dll. |
\G | Gunakan (masukkan) dari grup pencocokan penangkapan, memenuhi syarat dengan angka (1-x) dari grup |
\G | Grup Khusus 0 menyisipkan seluruh string yang cocok |
^ | Mulai dari string |
$ | Akhir string |
\D | Satu digit |
\D | Satu non-digit |
\S | Satu Whitespace |
\S | Satu non-whitespace |
(?Saya) | Abaikan awalan bendera case, seperti yang ditunjukkan di atas |
a | d | Satu karakter dari keduanya (alternatif untuk menggunakan []), 'a' atau 'd' |
\ | Lolos dari karakter khusus |
\B | Karakter Backspace |
\N | Karakter garis baru |
\R | Karakter pengembalian kereta |
\T | Karakter Tab |
Menarik? Setelah Anda mulai menggunakan ekspresi reguler, dalam bahasa apa pun, Anda akan segera menemukan bahwa Anda mulai menggunakannya di mana -mana - dalam bahasa pengkodean lainnya, dalam editor teks yang sadar regex -regex, pada baris perintah (lihat 'SED' untuk pengguna Linux), dll.
Anda mungkin juga akan menemukan bahwa Anda akan mulai menggunakannya lebih banyak ad-hoc, saya.e. bukan hanya dalam pengkodean. Ada sesuatu yang secara inheren kuat untuk dapat mengontrol segala macam output baris perintah, misalnya direktori dan daftar file, skrip dan manajemen teks file datar.
Nikmati kemajuan belajar Anda dan silakan posting beberapa contoh ekspresi reguler Anda yang paling kuat di bawah ini!
Tutorial Linux Terkait:
- Lanjutan regex bash canggih dengan contoh
- Bash Regexps untuk pemula dengan contoh
- Menguasai loop skrip bash
- Pengantar Otomatisasi Linux, Alat dan Teknik
- Hal -hal yang harus diinstal pada ubuntu 20.04
- Loop bersarang dalam skrip bash
- Manipulasi data besar untuk kesenangan dan keuntungan bagian 3
- Menangani input pengguna dalam skrip bash
- Buat redirect dan tulis ulang aturan ke .htaccess di Apache…
- Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
- « Cara menginstal codec & ekstra pihak ketiga di Manjaro Linux
- Cara menginstal paket dari AUR di Manjaro Linux »