Ekspresi reguler Python dengan contoh
- 2759
- 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
Ekspresi reguler Python dengan contoh 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
HDi lokasi yang tepat ini (yang langsung setelah/pada awal string) - [ELO]+: Cocokkan juga
e,latauHai('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
HDane1 kali atau lebih, dan dengan demikianDiadicocokkan - II: pencocokan literal
IIdi tempat yang tepat ini, dan dengan demikian memangIIdicocokkan 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
Rataul. Perhatikan baik -baik; hanyaRdicocokkan di sini! Tidak ada+dibalik]Jadi hanya satu karakter, keduanyaRataulakan dicocokkan di posisi ini. Jadi mengapaRldmasih cocok? Jawabannya ada di kualifikasi berikutnya; - .+: Cocokkan karakter apa pun (ditandai oleh
.) satu atau lebih kali, dengan demikianlDanDkeduanya 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 worldMenyalin 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
0ke9, 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 123Menyalin - (?i) [o-r]+: Cocokkan satu atau lebih
HAIkeRatau - terima kasih untuk opsionalSayabendera -HaikeR - (?Saya): preset case-tidak sensitif
SayaBendera untuk pola ini
>>> Cetak (RE.sub ('[1] 2', '_', 'halo dunia 111')) halo dunia _1Menyalin - [1] 2: Cocokkan karakternya
1Tepat dua kali
Contoh 7
>>> Cetak (RE.sub ('(dunia)', '\ g \ g', 'halo dunia 123')) halo worldworld 123Menyalin - (Dunia): Cocokkan teks literal 'dunia' dan jadikan itu kelompok yang kemudian dapat digunakan dalam substitusi
- \ g \ g: The
\GMenentukan grup pertama yang cocok, saya.e. teksDuniadiambil dariHalo Dunia 123string, dan ini diulangi dua kali, menghasilkanDunia Duniakeluaran. /li>
Contoh 8
Untuk membuat ini lebih jelas, pertimbangkan dua contoh berikut:
>>> Cetak (RE.sub ('(o)', '\ g \ g \ g', 'halo dunia 123')) hellooo wooorld 123Menyalin 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 123Menyalin Untuk contoh kedua, pertimbangkan:
>>> Cetak (RE.sub ('(o).*(r) ',' \ g \ g ',' halo dunia 123 ')) Hellorld 123Menyalin 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 123Menyalin Dapatkah Anda melihat bagaimana yang terakhir Hai dicocokkan?
Kembali ke contoh kami:
>>> Cetak (RE.sub ('(o).*(r) ',' \ g \ g ',' halo dunia 123 ')) Hellorld 123Menyalin 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 »