Ungkapan biasa python dengan contoh
- 4837
- 1177
- Dana Hammes
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
Keperluan perisian dan konvensyen yang digunakan
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 ”.
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
atauo
('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
dane
1 atau lebih kali, dan dengan ituDia
dipadankan - ll: pencocokan harfiah dari
ll
di tempat yang tepat ini, dan dengan itu memangll
dipadankan kerana ia datang secara langsungDia
- [o \ t]+: Padankan sama ada
"
(ruang), atauo
, atau\ t
(tab), dan 1 atau lebih kali, dan dengan ituo
(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
atauL
. Menonton dengan teliti; hanyar
dipadankan di sini! Tidak ada+
di belakang]
Jadi hanya satu watak, sama adar
atauL
akan dipadankan dalam kedudukan ini. Jadi mengaparld
masih dipadankan? Jawapannya adalah dalam kelayakan seterusnya; - .+: padankan mana -mana watak (ditandakan dengan
.
) satu atau lebih kali, oleh ituL
dand
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
ke9
, 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
keR
atau - terima kasih kepada pilihani
bendera -o
ker
- (?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. teksDunia
diambil dariHello World 123
rentetan, dan ini diulang dua kali, mengakibatkanDunia 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:
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?
- « Cara Memasang Codec & Tambahan Pihak Ketiga di Manjaro Linux
- Cara Memasang Pakej dari AUR di Manjaro Linux »