Python

Ungkapan Biasa menggunakan Python 3

Ungkapan Biasa menggunakan Python 3
Ungkapan Biasa sering dilihat sebagai siri hieroglif yang sangat kabur yang biasanya disalin oleh Internet dan ditampal ke kodnya. Mantra misterius ini kemudian menunjukkan keupayaan ajaib untuk mencari corak dalam rentetan teks dan jika kita menanyakannya dengan baik, malah akan memberi kita kebaikan untuk mengganti corak tertentu dalam rentetan dengan sesuatu yang lebih baik.

Contohnya, semasa anda menulis pengendali untuk URL (dan Tuhan menolong anda jika anda menulisnya dari awal), anda sering mahu memaparkan hasil yang sama tanpa mengira '/' yang tertinggal di URL. E.g https: // contoh.com / pengguna / tetapan / dan https: // contoh.com / pengguna / tetapan harus kedua-duanya menunjuk ke halaman yang sama walaupun mengikuti '/'. 

Walau bagaimanapun, anda tidak boleh mengabaikan semua garis miring ke depan, seperti:

  1. Garis depan antara 'pengguna' dan 'tetapan', e, 'pengguna / tetapan'.
  2. Anda juga harus mengambil kira '//' pada awal FQDN anda diikuti dengan 'https'.

Jadi, anda membuat peraturan seperti, “Abaikan hanya garis miring ke depan diikuti dengan tempat kosong."Dan jika anda mahu, anda boleh menyandikan peraturan itu dengan rangkaian pernyataan if-else. Tetapi itu akan menjadi agak membebankan dengan cepat. Anda boleh menulis fungsi mengatakan cleanUrl () yang dapat merangkum ini untuk anda. Tetapi alam semesta akan mula melemparkan lebih banyak bola curve kepada anda. Anda akan mendapati fungsi menulis untuk cleanHeaders (), processLog (), dll. Atau anda boleh menggunakan ungkapan biasa bila diperlukan jenis padanan corak.

Fail IO dan Fail standard

Sebelum kita mengetahui perincian ungkapan biasa, perlu disebutkan model yang dimiliki oleh kebanyakan sistem untuk aliran teks. Berikut adalah ringkasan ringkas (tidak lengkap) daripadanya:

  1. Teks diproses sebagai aliran (tunggal) watak.
  2. Aliran ini boleh berasal dari fail teks Unicode atau ASCII atau dari input standard (papan kekunci) atau dari sambungan rangkaian jauh. Setelah diproses, katakanlah dengan skrip regex, outputnya pergi ke aliran fail atau rangkaian atau output standard (e.g, konsol)
  3. Aliran terdiri daripada satu atau lebih baris. Setiap baris mempunyai sifar atau lebih watak diikuti dengan barisan baru.

Demi kesederhanaan, saya ingin anda membayangkan bahawa fail terdiri daripada baris yang diakhiri dengan watak barisan baru. Kami memecah fail ini ke dalam baris individu (atau rentetan) yang masing-masing berakhir sama ada dengan barisan baru atau watak biasa (untuk baris terakhir).

Regex dan Rentetan

Regex tidak ada kaitannya dengan fail. Bayangkan ia sebagai kotak hitam yang dapat mengambil input rentetan sewenang-wenangnya dengan panjang (terhingga) dan setelah mencapai hujung rentetan ini, ia dapat:

  1. Terima tali. Dengan kata lain, tali pertandingan ungkapan biasa (regex).
  2. Tolak rentetan, i.e, rentetan tidak padanan ungkapan biasa (regex).

Walaupun mempunyai kotak hitam-y, saya akan menambah beberapa kekangan pada mesin ini. Regex membaca rentetan secara berurutan, dari kiri ke kanan, dan ia hanya membaca satu watak pada satu masa. Jadi tali "LinuxHint" dengan dibaca sebagai:

'L "i" n "u" x "H" i "n" t' [Kiri ke kanan]

Mari mulakan sederhana

Jenis regex yang paling sederhana adalah mencari dan memadankan rentetan 'C'. Ungkapan biasa untuknya hanyalah 'C'. Cukup remeh. Cara melakukannya di Python memerlukan anda terlebih dahulu mengimport semula modul untuk ungkapan biasa.

>>> import semula

Kami kemudian menggunakan fungsi semula.cari (corak, tali) di mana corak adalah ungkapan biasa kami dan tali dalam rentetan input di mana kita mencari corak.

>>> semula.cari ('C', 'Kalimat ini mempunyai C yang disengaja')

Fungsi mengambil corak 'C', mencarinya dalam rentetan input dan mencetak lokasinya (span) di mana corak tersebut dijumpai. Bahagian rentetan, substring ini sesuai dengan ungkapan biasa kami. Sekiranya tidak ada padanan seperti itu didapati output akan menjadi Tiada objek.

Begitu juga, anda boleh mencari corak 'ungkapan biasa' seperti berikut:

>>> semula.cari ("ungkapan biasa", "Kita dapat menggunakan ungkapan biasa untuk mencari corak.")

semula.cari (), semula.padankan () dan re.padanan penuh ()

Tiga fungsi berguna dari modul semula termasuk:

1.  semula.cari (corak, tali)

Ini mengembalikan substring yang sesuai dengan corak, seperti yang telah kita lihat di atas. Sekiranya tidak dijumpai maka Tiada dikembalikan. Sekiranya beberapa substring sesuai dengan corak tertentu, kejadian pertama akan dilaporkan.

2.  semula.perlawanan (corak, tali)

Fungsi ini cuba memadankan corak yang disediakan dari awal rentetan. Sekiranya mengalami rehat di suatu tempat di pertengahan, ia akan kembali Tiada.

Sebagai contoh,

>>> semula.perlawanan ("Joh", "John Doe")

Di mana rentetan "Nama saya John Doe" tidak sesuai, dan karenanya Tiada dikembalikan.

>>> cetak (semula.pertandingan ("Joh", "Nama saya John Doe"))
Tiada

3.  semula.padanan penuh (corak, tali)

Ini lebih ketat daripada kedua-dua perkara di atas, dan cuba mencari padanan corak yang tepat dalam rentetan, jika tidak, Tiada.

>>> cetak (semula.padanan penuh ("Joh", "Joh"))

# Apa-apa lagi tidak akan sesuai

Saya akan menggunakan hanya semula.cari () berfungsi dalam artikel ini. Bila-bila masa, saya katakan regex menerima rentetan ini, itu bermaksud athe semula.cari () fungsi telah menemui substring yang sepadan dalam rentetan input dan mengembalikannya, bukan Tiadaobjek.

Watak khas

Ungkapan biasa seperti 'John' dan 'C' tidak banyak berguna. Kita memerlukan watak khas yang bermaksud khusus dalam konteks ungkapan biasa. Berikut adalah beberapa contoh:

    1. ^ - Ini sesuai dengan permulaan rentetan. Contohnya, '^ C' akan memadankan semua rentetan yang bermula dengan huruf C.
    2. $ - Ini sesuai dengan akhir baris.
    3. . - Titik adalah untuk menunjukkan satu atau lebih watak, kecuali garis baru.
    4. * - Ini adalah sifar atau lebih daripada watak yang mendahuluinya. Jadi b * sepadan dengan 0 atau lebih kejadian b. ab * sepadan dengan a, ab, dan a
    5. + - Ini adalah untuk satu atau lebih watak yang mendahuluinya. Jadi b + sepadan dengan 1 atau lebih kejadian b. ab * sepadan dengan a, ab, dan a
    6. \ - Backslash digunakan sebagai urutan melarikan diri dalam regexes. Oleh itu, anda mahukan ungkapan biasa untuk mencari kehadiran harfiah simbol dolar '$' dan bukannya akhir baris. Anda boleh menulis \ $ dalam ungkapan biasa.
    7. Pendakap kerinting boleh digunakan untuk menentukan jumlah pengulangan yang ingin anda lihat. Sebagai contoh, corak seperti ab 10 menandakan rentetan diikuti oleh 10 b akan sesuai dengan corak ini. Anda juga boleh menentukan julat nombor, seperti b 4,6 rentetan padanan yang mengandung b diulang 4 hingga 6 kali berturut-turut. Corak untuk 4 atau lebih pengulangan hanya memerlukan koma akhir, seperti b 4,
    8. Tanda kurung segi empat dan pelbagai watak. RE seperti [0-9] boleh bertindak seperti placeholder untuk sebarang digit antara 0 dan 9. Begitu juga, anda boleh mempunyai angka antara satu hingga lima [1-5] atau untuk mencocokkan penggunaan huruf besar mana pun [A-Z] atau untuk huruf Huruf Huruf apa pun tanpa mengira penggunaan huruf besar atau huruf kecil [A-z].
      Contohnya, sebarang rentetan yang terbuat dari sepuluh digit sama dengan ungkapan biasa [0-9] 10, sangat berguna ketika anda mencari nombor telefon dalam rentetan tertentu.
    9. Anda boleh membuat pernyataan suka ATAU, menggunakan | watak di mana ungkapan biasa terdiri daripada dua atau lebih ungkapan biasa, katakanlah, A dan B. Regex A | B adalah padanan jika rentetan input sama dengan padanan untuk ungkapan biasa A atau untuk B.
    10. Anda boleh mengumpulkan kumpulan regex yang berlainan. Contohnya, regex (A | B) C akan memadankan regex untuk AC dan

Ada banyak lagi yang perlu dilindungi, tetapi saya akan mengesyorkan belajar semasa anda pergi dan bukannya membebani otak anda dengan banyak simbol dan casing yang tidak jelas. Sekiranya ragu-ragu, Python Docs sangat membantu dan sekarang anda cukup tahu untuk mengikuti dokumen dengan mudah.

Tangan Pengalaman dan Rujukan

Sekiranya anda ingin melihat tafsiran visual regex anda, anda boleh melayari Debuggex. Laman web ini menghasilkan pandangan regex anda dalam masa nyata dan membolehkan anda mengujinya dengan pelbagai rentetan input.

Untuk mengetahui lebih lanjut mengenai aspek teori Ekspresi Biasa, anda mungkin ingin melihat beberapa bab pertama Pengantar Teori Pengiraan oleh Michael Sipser. Sangat mudah diikuti dan menunjukkan pentingnya ungkapan biasa sebagai konsep utama pengiraan itu sendiri!

Cara Menunjukkan Overlay OSD dalam Aplikasi dan Permainan Linux Skrin Penuh
Bermain permainan skrin penuh atau menggunakan aplikasi dalam mod skrin penuh bebas gangguan dapat memisahkan anda dari maklumat sistem yang relevan y...
5 Kad Tangkap Permainan Teratas
Kita semua telah melihat dan menyukai streaming permainan permainan di YouTube. PewDiePie, Jakesepticye, dan Markiplier hanyalah beberapa pemain terat...
Cara Membangunkan Permainan di Linux
Satu dekad yang lalu, tidak banyak pengguna Linux akan meramalkan bahawa sistem operasi kegemaran mereka suatu hari nanti akan menjadi platform permai...