Ekspresi reguler Python dengan contoh

Ekspresi reguler Python dengan contoh

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

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
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".

TAHUKAH KAMU?
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 atau Hai ('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 Dan e 1 kali atau lebih, dan dengan demikian Dia dicocokkan
  • II: pencocokan literal II di tempat yang tepat ini, dan dengan demikian memang II dicocokkan karena datang langsung setelahnya Dia
  • [o \ t]+: Cocokkan juga " (ruang), atau Hai, atau \T (tab), dan itu 1 kali atau lebih, dan dengan demikian Hai (O Space) cocok. Jika kami menggunakan tab sebagai ganti ruang, regex ini masih akan berfungsi!
  • Wo: Kecocokan literal Wo
  • [RL]: Cocokkan juga R atau l. Perhatikan baik -baik; hanya R dicocokkan di sini! Tidak ada + dibalik ] Jadi hanya satu karakter, keduanya R atau l akan dicocokkan di posisi ini. Jadi mengapa Rld masih cocok? Jawabannya ada di kualifikasi berikutnya;
  • .+: Cocokkan karakter apa pun (ditandai oleh .) satu atau lebih kali, dengan demikian l Dan D 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 ke 9, 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 ke R atau - terima kasih untuk opsional Saya bendera - Hai ke R
  • (?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. teks Dunia diambil dari Halo Dunia 123 string, dan ini diulangi dua kali, menghasilkan Dunia 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:

Daftar Notasi Ekspresi Reguler Python yang paling umum
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?