Ungkapan biasa python dengan contoh

Ungkapan biasa python dengan contoh

Ungkapan biasa (sering disingkat dengan "regex") adalah teknik, dan corak teks, yang mentakrifkan bagaimana seseorang ingin mencari atau mengubah suai rentetan yang diberikan. Ekspresi biasa biasanya digunakan dalam skrip shell bash dan kod python, serta dalam pelbagai bahasa pengaturcaraan lain.

Dalam tutorial ini anda akan belajar:

  • Cara Memulakan Dengan Ekspresi Biasa Pada Python
  • Cara Mengimport Modul Regex Python
  • Cara Memadankan Rentetan dan Karakter Menggunakan Notasi Regex
  • Cara Menggunakan Notasi Python Regex yang paling biasa
Ungkapan biasa python dengan contoh

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Mana -mana sistem operasi GNU/Linux
Perisian Python 2, Python 3
Yang lain Akses istimewa ke sistem linux anda sebagai akar atau melalui sudo perintah.
Konvensyen # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak

Contoh ungkapan biasa Python

Di Python, seseorang mahu mengimport Re modul untuk membolehkan penggunaan ungkapan biasa.

Contoh 1 Mari kita mulakan dengan contoh mudah:

$ python3 python 3.8.2 (lalai, 27 Apr 2020, 15:53:34) [GCC 9.3.0] pada jenis linux "bantuan", "hak cipta", "kredit" atau "lesen" untuk maklumat lanjut. >>> cetak ('hello world') hello world >>> import re >>> cetak (semula.perlawanan ('^.','Hai dunia')) 
Salinan

Di sini kita mula -mula dicetak Hai dunia Baris 5to menunjukkan persediaan cetakan ringkas. Kami kemudian mengimport modul Regex Re Garis 7 yang boleh digunakan untuk menggunakan .perlawanan Fungsi 8Matching Baris Biasa Perpustakaan tersebut.

Sintaks .perlawanan fungsi adalah (corak, rentetan) di mana corak ditakrifkan sebagai ungkapan biasa ^.'Dan kami menggunakan perkara yang sama Hai dunia rentetan sebagai rentetan input kami.

Seperti yang anda lihat, perlawanan ditemui dalam surat itu H. Alasan perlawanan ini ditemui adalah corak ungkapan biasa, iaitu; ^ bermaksud Permulaan rentetan dan . bermaksud Padankan mana -mana watak (kecuali Newline).

Oleh itu, H dijumpai, kerana surat itu langsung selepas "permulaan rentetan", dan digambarkan sebagai "mana -mana satu watak, H Dalam kes ini ”.

ADAKAH KAMU TAHU?
Konotasi khas ini adalah sama dengan ungkapan biasa dalam skrip bash, dan aplikasi regex yang lain, yang semuanya menggunakan standard regex seragam yang lebih kurang atau kurang, walaupun terdapat perbezaan antara bahasa dan bahkan pelaksanaan khusus jika anda menyelidiki sedikit ekspresi sedikit selanjutnya.

Contoh 2

>>> cetak (semula.Perlawanan ('... W', 'Hello World')) 
Salinan

Di sini kita gunakan . untuk memadankan mana -mana satu watak (kecuali Newline) dan kami melakukan ini 6 kali sebelum memadankan watak literal W.

Seperti yang anda lihat Helo w (7 aksara) dipadankan. Menariknya, pertunjukan ini sebagai span (0,7) yang tidak boleh dibaca sebagai 0-7 (iaitu 8 aksara) tetapi sebagai "bermula pada 0" "+7 aksara", seperti juga yang dapat melirik dari contoh-contoh lain dalam ini artikel.

Contoh 3 Mari kita ambil contoh lain, sedikit lebih kompleks:

>>> cetak (semula.perlawanan ('^h [elo]+', 'hello world')) 
Salinan

Sintaks dalam kes ini adalah:

  • ^: seperti yang diterangkan di atas, juga boleh dibaca sebagai 'ini mestilah permulaan rentetan'
  • H: mesti sepadan H Di lokasi yang tepat ini (yang secara langsung selepas/pada permulaan rentetan)
  • [ELO]+: Padankan sama ada e,L atau o ('Sama ada' ditakrifkan oleh ['dan']) dan + bermaksud 'satu atau lebih daripadanya'

Oleh itu, Helo dipadankan sebagai H memang pada permulaan rentetan, dan e dan o dan L dipadankan satu atau lebih kali (dalam apa -apa perintah).

Contoh 3ady untuk yang sangat kompleks?

>>> cetak (semula.findall ('^[he]+ll [o \ t]+wo [rl].+$ ',' Hello World ')) [' Hello World '];
Salinan

Di sini kami menggunakan fungsi lain dari modul Re, iaitu cari yang segera menghasilkan rentetan yang dijumpai dan menggunakan sintaks yang sama (corak, rentetan).

Kenapa Hai dunia perlawanan sepenuhnya? Mari kita pecahkan langkah demi langkah:

  • ^: Permulaan rentetan
  • [Dia]+: Perlawanan H dan e 1 atau lebih kali, dan dengan itu Dia dipadankan
  • ll: pencocokan harfiah dari ll di tempat yang tepat ini, dan dengan itu memang ll dipadankan kerana ia datang secara langsung Dia
  • [o \ t]+: Padankan sama ada " (ruang), atau o, atau \ t (tab), dan 1 atau lebih kali, dan dengan itu o (o ruang) dipadankan. Sekiranya kami menggunakan tab dan bukannya ruang, regex ini masih akan berfungsi!
  • Wo: Perlawanan literal dari Wo
  • [RL]: Padankan sama ada r atau L. Menonton dengan teliti; hanya r dipadankan di sini! Tidak ada + di belakang ] Jadi hanya satu watak, sama ada r atau L akan dipadankan dalam kedudukan ini. Jadi mengapa rld masih dipadankan? Jawapannya adalah dalam kelayakan seterusnya;
  • .+: padankan mana -mana watak (ditandakan dengan .) satu atau lebih kali, oleh itu L dan d kedua -duanya dipadankan, dan rentetan kami selesai
  • $: Sama seperti ^, watak ini menandakan "akhir rentetan".

Dalam erti kata lain, adakah kami meletakkan ini pada permulaannya, atau di tempat lain di tengah, regex akan tidak sesuai.

Sebagai contoh:

>>> cetak (semula.findall ('^hello $', 'hello world')) [] >>> cetak (semula.findall ('^hello $', 'hello')) [] >>> cetak (semula.findall ('^hello $', 'hello')) ['hello'] >>> cetak (semula.findall ('^hello', 'hello world')) ['hello']
Salinan

Di sini tiada output dikembalikan untuk dua cetakan pertama, kerana kami cuba memadankan rentetan yang boleh dibaca sebagai "start_of_string"-Helo-"End_of_string" seperti yang ditandakan oleh ^Hello $, terhadap Hai dunia yang tidak sepadan.

Dalam contoh ketiga, ^Hello $ perlawanan Helo kerana tidak ada watak tambahan di Helo rentetan yang akan menyebabkan regex ini gagal memadankan. Akhirnya, contoh terakhir menunjukkan perlawanan separa tanpa keperluan untuk "end_of_string" ($).

Lihat? Anda sudah menjadi pakar ungkapan biasa! Ekspresi biasa boleh menjadi menyeronokkan, dan sangat kuat!

Contoh 4
Terdapat pelbagai fungsi lain di Re Modul python, suka Re.sub, Re.berpecah, Re.subn, Re.cari, masing -masing dengan domain kes penggunaan yang berkenaan. Mari kita lihat semula.sub seterusnya:

>>> cetak (semula.sub ('hello', 'bye bye', 'hello world')) bye bye world
Salinan

Penggantian String adalah salah satu aplikasi yang paling kuat dalam ungkapan biasa, dalam bahasa Python dan bahasa pengekodan lain. Dalam contoh ini, kami mencari ^Helo dan menggantikannya dengan Selamat tinggal dalam rentetan Hai dunia. Bolehkah anda melihat bagaimana ini sangat berguna untuk memproses pelbagai pembolehubah dan rentetan teks dan juga fail teks rata?



Contoh 5
Mari kita lihat beberapa contoh yang lebih kompleks, menggunakan sintaks Regex yang lebih maju:

>>> cetak (semula.sub ('[0-9]+', '_', 'hello world 123')) Hello World _
Salinan
  • [0-9]+: Mana -mana watak angka dari 0 ke 9, satu atau lebih kali.

Bolehkah anda melihat bagaimana 123 digantikan oleh satu _ ?

Contoh 6

>>> cetak (semula.sub ('(?i) [o-r]+',' _ ',' hello world 123 ')) neraka_ w_ld 123
Salinan
  • (?i) [O-R]+: Padankan satu atau lebih O ke R atau - terima kasih kepada pilihan i bendera - o ke r
  • (?i): preset kes tidak sensitif i Bendera untuk corak ini
>>> cetak (semula.sub ('[1] 2', '_', 'Hello World 111')) Hello World _1
Salinan
  • [1] 2: Padankan watak 1 Tepat dua kali

Contoh 7

>>> cetak (semula.sub ('(dunia)', '\ g \ g', 'hello world 123')) hello worldworld 123
Salinan
  • (Dunia): Padankan teks 'dunia' literal dan menjadikannya kumpulan yang kemudiannya boleh digunakan dalam penggantian
  • \ g \ g: The \ g Menentukan kumpulan pertama yang dipadankan, i.e. teks Dunia diambil dari Hello World 123 rentetan, dan ini diulang dua kali, mengakibatkan Dunia Dunia pengeluaran. /li>

Contoh 8

Untuk menjadikannya lebih jelas, pertimbangkan dua contoh berikut:

>>> cetak (semula.sub ('(o)', '\ g \ g \ g', 'hello world 123')) Hellooo wooorld 123
Salinan

Dalam contoh pertama ini, kita hanya sepadan o dan letakkan dalam kumpulan, kemudian ulangi kumpulan itu tiga kali di luar.

Perhatikan bahawa jika kita tidak akan merujuk kepada Kumpulan 1 (kumpulan yang dipadankan pertama, contoh kedua ref), maka tidak akan ada output dan hasilnya akan:

>>> cetak (semula.sub ('(o)', ',' hello world 123 ')) neraka wrld 123
Salinan

Untuk contoh kedua, pertimbangkan:

>>> cetak (semula.sub ('(o).*(r) ',' \ g \ g ',' Hello World 123 ')) Hellorld 123
Salinan

Di sini kita mempunyai dua kumpulan, yang pertama adalah o (Di mana sahaja kumpulan itu sepadan, dan terdapat jelas pelbagai seperti yang dilihat dalam contoh pertama), dan yang kedua adalah r. Di samping itu, kami menggunakan .* yang diterjemahkan kepada "apa -apa watak, beberapa kali" - ungkapan biasa yang sering digunakan.

Jadi dalam contoh ini o wor dipadankan oleh (o).*(r) '(' o Pertama, maka watak sehingga yang terakhir r dicapai. Tanggapan "The Last" sangat import dan mudah membuat kesilapan/gotcha, terutama untuk pengguna ekspresi biasa baru. Sebagai contoh sampingan, pertimbangkan:

>>> cetak (semula.sub ('e.*o ',' _ ',' hello world 123 ')) h_rld 123
Salinan

Bolehkah anda melihat bagaimana yang terakhir o dipadankan?

Kembali ke contoh kami:

>>> cetak (semula.sub ('(o).*(r) ',' \ g \ g ',' Hello World 123 ')) Hellorld 123
Salinan

Kita dapat melihatnya o wor digantikan dengan pertandingan kumpulan 1 diikuti dengan pertandingan kumpulan 2, yang mengakibatkan: o wor digantikan oleh atau dan dengan itu outputnya adalah Hellorld 123.



Kesimpulan

Mari kita lihat beberapa nota ekspresi biasa yang lebih biasa yang terdapat di Python, dipadankan dengan beberapa pelaksanaan ringan yang sama:

Senarai notasi ungkapan biasa Python yang paling biasa
Notasi regex Penerangan
. Apa -apa watak, kecuali Newline
[A-C] Satu watak julat yang dipilih, dalam kes ini A, B, C
[A-Z] Satu watak julat yang dipilih, dalam kes ini a-z
[0-9AF-Z] Satu watak julat yang dipilih, dalam kes ini 0-9, A, dan F-Z
[^A-za-z] Satu watak di luar julat yang dipilih, dalam kes ini misalnya '1' akan memenuhi syarat
* Sebilangan pertandingan (0 atau lebih)
+ 1 atau lebih perlawanan
? Perlawanan 0 atau 1
3 Tepat 3 perlawanan
() Kumpulan menangkap. Kali pertama ini digunakan, nombor kumpulan adalah 1, dll.
\ g Gunakan (sisipkan) kumpulan perlawanan tangkapan, layak dengan nombor (1-x) kumpulan
\ g Kumpulan Khas 0 memasukkan keseluruhan rentetan yang dipadankan
^ Permulaan rentetan
$ Akhir rentetan
\ d Satu digit
\ D Satu bukan digit
\ s Satu ruang putih
\ S Satu bukan whitespace
(?i) Abaikan awalan bendera kes, seperti yang ditunjukkan di atas
a | d Satu watak daripada kedua -dua (alternatif untuk menggunakan []), 'a' atau 'd'
\ Melarikan diri watak khas
\ b Watak Backspace
\ n Watak baru
\ r Watak pulangan kereta
\ t Watak tab

Menarik? Sebaik sahaja anda mula menggunakan ungkapan biasa, dalam bahasa apa pun, anda akan mendapati bahawa anda mula menggunakannya di mana -mana - dalam bahasa pengekodan lain, dalam editor teks regex -aware kegemaran anda, pada baris arahan (lihat 'sed' untuk pengguna Linux), dan lain-lain.

Anda mungkin juga akan mendapati bahawa anda akan mula menggunakannya lebih banyak ad-hoc, i.e. bukan hanya dalam pengekodan. Terdapat sesuatu yang sememangnya kuat dalam dapat mengawal pelbagai jenis output baris arahan, contohnya direktori dan penyenaraian fail, skrip dan pengurusan teks fail rata.

Nikmati kemajuan pembelajaran anda dan sila hantarkan beberapa contoh ekspresi biasa anda yang paling kuat di bawah!



Tutorial Linux Berkaitan:

  • Advanced Bash Regex dengan contoh
  • Bash regexps untuk pemula dengan contoh
  • Menguasai Gelung Skrip Bash
  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Gelung bersarang dalam skrip bash
  • Manipulasi data besar untuk keseronokan dan keuntungan bahagian 3
  • Mengendalikan input pengguna dalam skrip bash
  • Buat pengalihan dan tulis semula peraturan ke dalam .Htaccess di Apache ..
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?