Dokumen ini adalah tutorial pengantar untuk menggunakan ekspresi reguler di Python dengan modul. Ini memberikan pengantar yang lebih lembut daripada bagian yang sesuai di Referensi Perpustakaan Show
pengantarEkspresi reguler (disebut RE, atau regex, atau pola regex) pada dasarnya adalah bahasa pemrograman kecil yang sangat terspesialisasi yang disematkan di dalam Python dan tersedia melalui modul. Dengan menggunakan bahasa kecil ini, Anda menentukan aturan untuk sekumpulan kemungkinan string yang ingin Anda cocokkan; . Anda kemudian dapat mengajukan pertanyaan seperti "Apakah string ini cocok dengan polanya?", atau "Apakah ada kecocokan untuk pola di mana pun dalam string ini?". Anda juga dapat menggunakan RE untuk memodifikasi string atau memisahkannya dengan berbagai cara Pola ekspresi reguler dikompilasi menjadi serangkaian bytecode yang kemudian dieksekusi oleh mesin pencocokan yang ditulis dalam C. Untuk penggunaan tingkat lanjut, mungkin perlu memperhatikan dengan seksama bagaimana mesin akan mengeksekusi RE yang diberikan, dan menulis RE dengan cara tertentu untuk menghasilkan bytecode yang berjalan lebih cepat. Pengoptimalan tidak tercakup dalam dokumen ini, karena Anda harus memiliki pemahaman yang baik tentang bagian dalam mesin pencocokan Bahasa ekspresi reguler relatif kecil dan terbatas, sehingga tidak semua kemungkinan tugas pemrosesan string dapat dilakukan menggunakan ekspresi reguler. Ada juga tugas yang bisa dilakukan dengan ekspresi reguler, tetapi ekspresinya ternyata sangat rumit. Dalam kasus ini, Anda mungkin lebih baik menulis kode Python untuk melakukan pemrosesan; Pola SederhanaKita akan mulai dengan mempelajari tentang ekspresi reguler yang paling sederhana. Karena ekspresi reguler digunakan untuk mengoperasikan string, kita akan mulai dengan tugas yang paling umum. karakter yang cocok Untuk penjelasan mendetail tentang ilmu komputer yang mendasari ekspresi reguler (finite automata deterministik dan non-deterministik), Anda dapat merujuk ke hampir semua buku teks tentang kompiler penulisan Mencocokkan KarakterSebagian besar huruf dan karakter hanya akan cocok dengan dirinya sendiri. Misalnya, ekspresi reguler >>> p.match("") >>> print(p.match("")) None_7 akan sama persis dengan string >>> p.match("") >>> print(p.match("")) None7. (Anda dapat mengaktifkan mode case-insensitive yang memungkinkan RE ini cocok dengan >>> p.match("") >>> print(p.match("")) None9 atau >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>0 juga; lebih lanjut tentang ini nanti. ) Ada pengecualian untuk aturan ini; . Alih-alih, mereka menandakan bahwa beberapa hal yang tidak biasa harus dicocokkan, atau mereka mempengaruhi bagian lain dari RE dengan mengulanginya atau mengubah maknanya. Banyak dari dokumen ini dikhususkan untuk membahas berbagai karakter meta dan apa yang mereka lakukan Berikut daftar lengkap dari metakarakter; . ^ $ * + ? { } [ ] \ | ( )_ Metakarakter pertama yang akan kita lihat adalah >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>1 dan >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>2. Mereka digunakan untuk menentukan kelas karakter, yang merupakan sekumpulan karakter yang ingin Anda cocokkan. Karakter dapat dicantumkan secara individual, atau rentang karakter dapat ditunjukkan dengan memberikan dua karakter dan memisahkannya dengan >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>3. Misalnya, >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>_4 akan cocok dengan salah satu karakter >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>5, >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>6, atau >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>7; . Jika Anda hanya ingin mencocokkan huruf kecil, RE Anda akan menjadi >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>9 Metakarakter (kecuali >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)_0) tidak aktif di dalam kelas. Misalnya, >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)_1 akan cocok dengan salah satu karakter >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)2, >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)3, >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)4, atau >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)5; Anda dapat mencocokkan karakter yang tidak tercantum dalam kelas dengan melengkapi set. Ini ditunjukkan dengan menyertakan >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)_7 sebagai karakter pertama kelas. Misalnya, >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)_8 akan cocok dengan karakter apa pun kecuali >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)9. Jika tanda sisipan muncul di tempat lain di kelas karakter, itu tidak memiliki arti khusus. Sebagai contoh. >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)0 akan cocok dengan >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)9 atau >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)7 Mungkin karakter meta yang paling penting adalah garis miring terbalik, >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)0. Seperti dalam literal string Python, backslash dapat diikuti oleh berbagai karakter untuk menandakan berbagai urutan khusus. Ini juga digunakan untuk menghindari semua karakter meta sehingga Anda masih bisa mencocokkannya dalam pola; . >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)6 atau >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)7 Beberapa urutan khusus yang dimulai dengan >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)8 mewakili kumpulan karakter yang ditentukan sebelumnya yang sering berguna, seperti kumpulan angka, kumpulan huruf, atau kumpulan apa pun yang bukan spasi putih Mari kita ambil contoh. >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)9 cocok dengan karakter alfanumerik apa pun. Jika pola regex dinyatakan dalam byte, ini setara dengan kelas p = re.compile( ... ) m = p.match( 'string goes here' ) if m: print('Match found: ', m.group()) else: print('No match')0. Jika pola regex berupa string, >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)9 akan cocok dengan semua karakter yang ditandai sebagai huruf dalam database Unicode yang disediakan oleh modul. Anda dapat menggunakan definisi yang lebih terbatas dari >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)_9 dalam pola string dengan menyediakan flag saat mengkompilasi ekspresi reguler Daftar urutan khusus berikut tidak lengkap. Untuk daftar lengkap urutan dan definisi kelas yang diperluas untuk pola string Unicode, lihat bagian terakhir dari referensi Perpustakaan Standar. Secara umum, versi Unicode cocok dengan karakter apa pun yang berada dalam kategori yang sesuai di basis data Unicode p = re.compile( ... ) m = p.match( 'string goes here' ) if m: print('Match found: ', m.group()) else: print('No match')5 Cocok dengan digit desimal apa pun; p = re.compile( ... ) m = p.match( 'string goes here' ) if m: print('Match found: ', m.group()) else: print('No match')7 Cocok dengan karakter non-digit apa pun; p = re.compile( ... ) m = p.match( 'string goes here' ) if m: print('Match found: ', m.group()) else: print('No match')_9 Cocok dengan karakter spasi apa pun; >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']1 Cocok dengan karakter non-spasi apa pun; >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)_9 Cocok dengan karakter alfanumerik apa pun; >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']5 Cocok dengan karakter non-alfanumerik apa pun; Urutan ini dapat dimasukkan ke dalam kelas karakter. Misalnya, >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']_7 adalah kelas karakter yang akan cocok dengan karakter spasi apa pun, atau >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']8 atau >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']9 Metakarakter terakhir di bagian ini adalah >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')00. Itu cocok dengan apa pun kecuali karakter baris baru, dan ada mode alternatif () yang cocok bahkan dengan baris baru. >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_00 sering digunakan di mana Anda ingin mencocokkan "karakter apa pun" Mengulangi HalMampu mencocokkan kumpulan karakter yang bervariasi adalah hal pertama yang dapat dilakukan ekspresi reguler yang belum mungkin dilakukan dengan metode yang tersedia pada string. Namun, jika itu adalah satu-satunya kemampuan tambahan dari regex, mereka tidak akan banyak kemajuan. Kemampuan lainnya adalah Anda dapat menentukan bahwa bagian dari RE harus diulang beberapa kali Karakter meta pertama untuk mengulangi hal-hal yang akan kita lihat adalah >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')03. >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_03 tidak cocok dengan karakter literal >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')05; Misalnya, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')06 akan cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')07 (0 >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)2 karakter), >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')09 (1 >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)2), >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')11 (3 >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)2 karakter), dan seterusnya Pengulangan seperti >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_03 serakah; . Jika nanti bagian dari pola tidak cocok, mesin pencocokan akan mencadangkan dan mencoba lagi dengan pengulangan yang lebih sedikit Contoh langkah demi langkah akan membuat ini lebih jelas. Mari pertimbangkan ungkapan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')14. Ini cocok dengan huruf >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)_2, nol atau lebih huruf dari kelas >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')16, dan diakhiri dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')17. Sekarang bayangkan mencocokkan RE ini dengan string >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')18 Melangkah Cocok Penjelasan 1 >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>5 >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>_5 dalam pertandingan RE 2 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_21 Mesinnya cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')22, pergi sejauh mungkin, yaitu sampai ke ujung tali 3 Kegagalan Mesin mencoba mencocokkan >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>6, tetapi posisi saat ini berada di ujung string, sehingga gagal 4 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_24 Cadangkan, sehingga ________ 52 ______ 22 cocok dengan satu karakter yang lebih sedikit 5 Kegagalan Coba >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>_6 lagi, tetapi posisi saat ini berada di karakter terakhir, yaitu >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')27 6 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_28 Cadangkan lagi, sehingga >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')22 hanya cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')30 6 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_24 Coba >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>_6 lagi. Kali ini karakter pada posisi sekarang adalah >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')17, jadi berhasil Akhir dari RE sekarang telah tercapai, dan cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')34. Ini menunjukkan bagaimana mesin pencocokan berjalan sejauh mungkin pada awalnya, dan jika tidak ada kecocokan yang ditemukan, mesin tersebut akan secara progresif mencadangkan dan mencoba kembali sisa RE lagi dan lagi. Ini akan mencadangkan hingga mencoba nol kecocokan untuk ________ 52 _______ 22, dan jika kemudian gagal, mesin akan menyimpulkan bahwa string tidak cocok dengan RE sama sekali Metakarakter berulang lainnya adalah >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')36, yang cocok satu kali atau lebih. Perhatikan baik-baik perbedaan antara >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')03 dan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')36; . Untuk menggunakan contoh serupa, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_41 akan cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')09 (1 >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)2), >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')11 (3 >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)2s), tetapi tidak akan cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')07 Ada dua operator berulang atau pembilang. Karakter tanda tanya, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_47, cocok sekali atau nol kali; . Misalnya, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')48 cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')49 atau >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')50 Kuantor yang paling rumit adalah >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_51, di mana m dan n adalah bilangan bulat desimal. Penghitung ini berarti harus ada setidaknya m pengulangan, dan paling banyak n. Misalnya, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_52 akan cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')53, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')54, dan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')55. Ini tidak cocok dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_56, yang tidak memiliki garis miring, atau >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')57, yang memiliki empat Anda dapat menghilangkan m atau n; . Menghilangkan m diartikan sebagai batas bawah 0, sedangkan menghilangkan n menghasilkan batas atas tak terhingga Pembaca dari kecenderungan reduksionis mungkin memperhatikan bahwa ketiga bilangan lainnya semuanya dapat diekspresikan menggunakan notasi ini. >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_58 sama dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')03, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')60 sama dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')36, dan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')62 sama dengan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')47. Lebih baik menggunakan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_03, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')36, atau >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')47 saat Anda bisa, hanya karena lebih pendek dan lebih mudah dibaca Menggunakan Ekspresi RegulerSekarang setelah kita melihat beberapa ekspresi reguler sederhana, bagaimana sebenarnya kita menggunakannya di Python? Mengompilasi Ekspresi RegulerEkspresi reguler dikompilasi menjadi objek pola, yang memiliki metode untuk berbagai operasi seperti mencari kecocokan pola atau melakukan penggantian string >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*') juga menerima argumen flag opsional, yang digunakan untuk mengaktifkan berbagai fitur khusus dan variasi sintaks. Kami akan membahas pengaturan yang tersedia nanti, tetapi untuk saat ini satu contoh sudah cukup >>> p = re.compile('ab*', re.IGNORECASE) RE diteruskan ke sebagai string. RE ditangani sebagai string karena ekspresi reguler bukan bagian dari inti bahasa Python, dan tidak ada sintaks khusus yang dibuat untuk mengekspresikannya. (Ada aplikasi yang tidak membutuhkan RE sama sekali, jadi tidak perlu membengkakkan spesifikasi bahasa dengan memasukkannya. ) Alih-alih, modulnya hanyalah modul ekstensi C yang disertakan dengan Python, seperti halnya modul or Menempatkan RE dalam string membuat bahasa Python lebih sederhana, tetapi memiliki satu kelemahan yang merupakan topik dari bagian selanjutnya Wabah BackslashSeperti yang dinyatakan sebelumnya, ekspresi reguler menggunakan karakter garis miring terbalik ( >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)8) untuk menunjukkan bentuk khusus atau untuk mengizinkan karakter khusus digunakan tanpa menyebutkan arti khusus mereka. Ini bertentangan dengan penggunaan karakter yang sama oleh Python untuk tujuan yang sama dalam literal string Katakanlah Anda ingin menulis RE yang cocok dengan string >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')74, yang mungkin ditemukan dalam file LaTeX. Untuk mengetahui apa yang harus ditulis dalam kode program, mulailah dengan string yang diinginkan untuk dicocokkan. Selanjutnya, Anda harus menghindari garis miring terbalik dan karakter meta lainnya dengan mengawalinya dengan garis miring terbalik, menghasilkan string >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')75. Hasil string yang harus diteruskan harus >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')75. Namun, untuk menyatakan ini sebagai literal string Python, kedua garis miring terbalik harus di-escape lagi Karakter Panggung >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_74 String teks yang akan dicocokkan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_75 Tanda garis miring terbalik untuk >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_81 Garis miring terbalik yang lolos untuk string literal Singkatnya, untuk mencocokkan backslash literal, seseorang harus menulis >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')82 sebagai string RE, karena ekspresi reguler harus >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)7, dan setiap backslash harus dinyatakan sebagai >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)7 di dalam string Python reguler literal. Dalam RE yang menampilkan garis miring terbalik berulang kali, hal ini menyebabkan banyak garis miring terbalik berulang dan membuat string yang dihasilkan sulit dipahami Solusinya adalah menggunakan notasi string mentah Python untuk ekspresi reguler; . Ekspresi reguler akan sering ditulis dalam kode Python menggunakan notasi string mentah ini Selain itu, sekuens escape khusus yang valid dalam ekspresi reguler, tetapi tidak valid sebagai literal string Python, sekarang menghasilkan a dan pada akhirnya akan menjadi a , yang berarti sekuens tersebut akan menjadi tidak valid jika notasi string mentah atau pelolosan garis miring terbalik tidak digunakan Tali Biasa Tali mentah >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_92 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_93 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_81 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_95 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_96 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_97 Melakukan PertandinganSetelah Anda memiliki objek yang mewakili ekspresi reguler terkompilasi, apa yang Anda lakukan dengannya? . Hanya yang paling signifikan yang akan dibahas di sini; Metode/Atribut Tujuan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_99 Tentukan apakah RE cocok di awal string >>> p = re.compile('ab*', re.IGNORECASE)_00 Pindai melalui string, cari lokasi mana pun yang cocok dengan RE ini >>> p = re.compile('ab*', re.IGNORECASE)_01 Temukan semua substring di mana RE cocok, dan kembalikan sebagai daftar >>> p = re.compile('ab*', re.IGNORECASE)_02 Temukan semua substring di mana RE cocok, dan kembalikan sebagai dan kembalikan >>> p = re.compile('ab*', re.IGNORECASE)05 jika tidak ada kecocokan yang dapat ditemukan. Jika berhasil, sebuah instance dikembalikan, berisi informasi tentang kecocokan. di mana itu dimulai dan diakhiri, substring yang cocok, dan banyak lagi Anda dapat mempelajarinya dengan bereksperimen secara interaktif dengan modul. Jika tersedia, Anda mungkin juga ingin melihat Tools/demo/redemo. py, program demonstrasi yang disertakan dengan distribusi Python. Ini memungkinkan Anda untuk memasukkan RE dan string, dan menampilkan apakah RE cocok atau gagal. >>> p = re.compile('ab*', re.IGNORECASE)_08 bisa sangat berguna saat mencoba men-debug RE yang rumit HOWTO ini menggunakan interpreter Python standar untuk contohnya. Pertama, jalankan interpreter Python, impor modul, dan kompilasi RE >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+') Sekarang, Anda dapat mencoba mencocokkan berbagai string dengan RE >>> p = re.compile('ab*', re.IGNORECASE)10. String kosong tidak boleh sama sekali, karena >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')36 berarti 'satu atau lebih pengulangan'. harus mengembalikan >>> p = re.compile('ab*', re.IGNORECASE)05 dalam hal ini, yang akan menyebabkan penerjemah tidak mencetak keluaran. Anda dapat secara eksplisit mencetak hasil >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')99 untuk memperjelasnya >>> p.match("") >>> print(p.match("")) None Sekarang, mari kita coba pada string yang seharusnya cocok, seperti >>> p = re.compile('ab*', re.IGNORECASE)15. Dalam hal ini, akan mengembalikan a , jadi Anda harus menyimpan hasilnya dalam variabel untuk digunakan nanti >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'> Sekarang Anda dapat meminta informasi tentang string yang cocok. Instance objek yang cocok juga memiliki beberapa metode dan atribut; Metode/Atribut Tujuan >>> p = re.compile('ab*', re.IGNORECASE)_17 Kembalikan string yang cocok dengan RE >>> p = re.compile('ab*', re.IGNORECASE)_18 Kembalikan posisi awal pertandingan >>> p = re.compile('ab*', re.IGNORECASE)_19 Kembalikan posisi akhir pertandingan >>> p = re.compile('ab*', re.IGNORECASE)_20 Kembalikan tuple yang berisi posisi (mulai, akhir) dari pertandingan Mencoba metode ini akan segera memperjelas artinya >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5) mengembalikan substring yang cocok dengan RE. dan kembalikan indeks awal dan akhir pertandingan. mengembalikan indeks awal dan akhir dalam satu Tuple. Karena metode ini hanya memeriksa apakah RE cocok di awal string, >>> p = re.compile('ab*', re.IGNORECASE)18 akan selalu nol. Namun, metode pola memindai melalui string, sehingga kecocokan mungkin tidak dimulai dari nol dalam kasus tersebut >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11) Dalam program sebenarnya, gaya yang paling umum adalah menyimpan the dalam sebuah variabel, lalu memeriksa apakah >>> p = re.compile('ab*', re.IGNORECASE)05. Ini biasanya terlihat seperti p = re.compile( ... ) m = p.match( 'string goes here' ) if m: print('Match found: ', m.group()) else: print('No match') Dua metode pola mengembalikan semua kecocokan untuk sebuah pola. mengembalikan daftar string yang cocok >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10'] Awalan >>> p = re.compile('ab*', re.IGNORECASE)30, membuat literal menjadi string literal mentah, diperlukan dalam contoh ini karena escape sequence dalam literal string "dimasak" normal yang tidak dikenali oleh Python, berlawanan dengan ekspresi reguler, sekarang menghasilkan a dan pada akhirnya akan menjadi a. Lihat harus membuat seluruh daftar sebelum dapat dikembalikan sebagai hasilnya. Metode mengembalikan urutan instance sebagai >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_0 Fungsi Tingkat ModulAnda tidak perlu membuat objek pola dan memanggil metodenya; . Fungsi ini mengambil argumen yang sama dengan metode pola yang sesuai dengan string RE yang ditambahkan sebagai argumen pertama, dan masih mengembalikan >>> p = re.compile('ab*', re.IGNORECASE)05 atau instance >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_1 Di bawah tenda, fungsi-fungsi ini hanya membuat objek pola untuk Anda dan memanggil metode yang sesuai di atasnya. Mereka juga menyimpan objek yang dikompilasi dalam cache, sehingga panggilan selanjutnya menggunakan RE yang sama tidak perlu mengurai pola berulang kali. Haruskah Anda menggunakan fungsi tingkat modul ini, atau haruskah Anda mendapatkan pola dan memanggil metodenya sendiri? . Di luar loop, tidak banyak perbedaan berkat cache internal Bendera kompilasiTanda kompilasi memungkinkan Anda memodifikasi beberapa aspek tentang cara kerja ekspresi reguler. Bendera tersedia dalam modul dengan dua nama, nama panjang seperti >>> p = re.compile('ab*', re.IGNORECASE)42 dan bentuk pendek satu huruf seperti >>> p = re.compile('ab*', re.IGNORECASE)43. (Jika Anda terbiasa dengan pengubah pola Perl, formulir satu huruf menggunakan huruf yang sama; bentuk singkatnya adalah , misalnya. ) Beberapa flag dapat ditentukan dengan bitwise OR-ing; Berikut tabel bendera yang tersedia, diikuti dengan penjelasan yang lebih mendetail untuk masing-masing bendera Bendera Arti >>> p = re.compile('ab*', re.IGNORECASE)_49, >>> p = re.compile('ab*', re.IGNORECASE)50 Membuat beberapa pelarian seperti >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)_9, >>> p = re.compile('ab*', re.IGNORECASE)52, p = re.compile( ... ) m = p.match( 'string goes here' ) if m: print('Match found: ', m.group()) else: print('No match')9 dan p = re.compile( ... ) m = p.match( 'string goes here' ) if m: print('Match found: ', m.group()) else: print('No match')5 hanya cocok pada karakter ASCII dengan properti masing-masing >>> p = re.compile('ab*', re.IGNORECASE)_55, >>> p = re.compile('ab*', re.IGNORECASE)56 Jadikan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_00 cocok dengan karakter apa pun, termasuk baris baru >>> p = re.compile('ab*', re.IGNORECASE)_42, >>> p = re.compile('ab*', re.IGNORECASE)43 Lakukan pencocokan case-insensitive >>> p = re.compile('ab*', re.IGNORECASE)_60, >>> p = re.compile('ab*', re.IGNORECASE)61 Lakukan pencocokan sadar-lokal >>> p = re.compile('ab*', re.IGNORECASE)_62, >>> p = re.compile('ab*', re.IGNORECASE)48 Pencocokan beberapa baris, memengaruhi >>> p = re.compile('ab*', re.IGNORECASE)64 dan >>> p = re.compile('ab*', re.IGNORECASE)65 >>> p = re.compile('ab*', re.IGNORECASE)_66, >>> p = re.compile('ab*', re.IGNORECASE)67 (untuk 'diperpanjang') Aktifkan RES verbose, yang dapat diatur dengan lebih rapi dan mudah dipahami SAYAABAIKAN KASUSLakukan pencocokan case-insensitive; . Misalnya, >>> p = re.compile('ab*', re.IGNORECASE)_68 juga akan cocok dengan huruf kecil. Pencocokan Unicode penuh juga berfungsi kecuali bendera >>> p = re.compile('ab*', re.IGNORECASE)49 digunakan untuk menonaktifkan kecocokan non-ASCII. Ketika pola Unicode >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>9 atau >>> p = re.compile('ab*', re.IGNORECASE)68 digunakan dalam kombinasi dengan bendera >>> p = re.compile('ab*', re.IGNORECASE)42, mereka akan cocok dengan 52 huruf ASCII dan 4 huruf non-ASCII tambahan. 'İ' (U+0130, huruf besar Latin I dengan titik di atas), 'ı' (U+0131, huruf Latin kecil tanpa titik i), 'ſ' (U+017F, huruf Latin kecil panjang s) dan 'K' . >>> p = re.compile('ab*', re.IGNORECASE)_73 akan cocok dengan >>> p = re.compile('ab*', re.IGNORECASE)74, >>> p = re.compile('ab*', re.IGNORECASE)75, >>> p = re.compile('ab*', re.IGNORECASE)76, atau >>> p = re.compile('ab*', re.IGNORECASE)77 (yang terakhir hanya cocok dalam mode Unicode). Huruf kecil ini tidak memperhitungkan lokal saat ini; LLOKAL Jadikan >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)_9, >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']5, >>> p = re.compile('ab*', re.IGNORECASE)52, >>> p = re.compile('ab*', re.IGNORECASE)82 dan pencocokan case-insensitive bergantung pada lokal saat ini, bukan database Unicode Lokal adalah fitur perpustakaan C yang dimaksudkan untuk membantu dalam menulis program yang mempertimbangkan perbedaan bahasa. Misalnya, jika Anda memproses teks Prancis yang disandikan, Anda ingin dapat menulis >>> p = re.compile('ab*', re.IGNORECASE)83 untuk mencocokkan kata, tetapi >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)9 hanya cocok dengan kelas karakter >>> p = re.compile('ab*', re.IGNORECASE)85 dalam pola byte; . Jika sistem Anda dikonfigurasi dengan benar dan lokal Prancis dipilih, fungsi C tertentu akan memberi tahu program bahwa byte yang sesuai dengan >>> p = re.compile('ab*', re.IGNORECASE)86 juga harus dianggap sebagai huruf. Menyetel flag >>> p = re.compile('ab*', re.IGNORECASE)60 saat mengkompilasi ekspresi reguler akan menyebabkan objek terkompilasi yang dihasilkan menggunakan fungsi C ini untuk >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)9; . Penggunaan flag ini tidak disarankan di Python 3 karena mekanisme lokal sangat tidak dapat diandalkan, hanya menangani satu "budaya" pada satu waktu, dan hanya bekerja dengan lokal 8-bit. Pencocokan Unicode sudah diaktifkan secara default di Python 3 untuk pola Unicode (str), dan mampu menangani berbagai lokal/bahasaMMULTILINE ( >>> p = re.compile('ab*', re.IGNORECASE)_64 dan >>> p = re.compile('ab*', re.IGNORECASE)65 belum dijelaskan; mereka akan diperkenalkan di bagian. ) Biasanya >>> p = re.compile('ab*', re.IGNORECASE)64 hanya cocok di awal string, dan >>> p = re.compile('ab*', re.IGNORECASE)65 hanya cocok di akhir string dan tepat sebelum baris baru (jika ada) di akhir string. Saat bendera ini ditentukan, >>> p = re.compile('ab*', re.IGNORECASE)_64 cocok di awal string dan di awal setiap baris dalam string, langsung mengikuti setiap baris baru. Demikian pula, metakarakter >>> p = re.compile('ab*', re.IGNORECASE)65 cocok di akhir string dan di akhir setiap baris (tepat sebelum setiap baris baru)SDOTALL Membuat karakter khusus >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']_9 cocok dengan karakter apa pun, termasuk baris baru; AASCII Jadikan >>> print(p.match('::: message')) None >>> m = p.search('::: message'); print(m) <re.Match object; span=(4, 11), match='message'> >>> m.group() 'message' >>> m.span() (4, 11)_9, >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']5, >>> p = re.compile('ab*', re.IGNORECASE)52, >>> p = re.compile('ab*', re.IGNORECASE)82, p = re.compile( ... ) m = p.match( 'string goes here' ) if m: print('Match found: ', m.group()) else: print('No match')9 dan >>> p = re.compile(r'\d+') >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') ['12', '11', '10']1 melakukan pencocokan khusus ASCII alih-alih pencocokan Unicode penuh. Ini hanya berarti untuk pola Unicode, dan diabaikan untuk pola byteXVERBOSE Tanda ini memungkinkan Anda menulis ekspresi reguler yang lebih mudah dibaca dengan memberi Anda lebih banyak fleksibilitas dalam cara memformatnya. Saat flag ini telah ditentukan, spasi putih di dalam string RE diabaikan, kecuali jika spasi putih ada di kelas karakter atau didahului dengan garis miring terbalik yang tidak lolos; . Bendera ini juga memungkinkan Anda memberi komentar di dalam RE yang akan diabaikan oleh mesin; Misalnya, inilah RE yang menggunakan ; >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_2 Tanpa pengaturan verbose, RE akan terlihat seperti ini >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_3 Dalam contoh di atas, rangkaian literal string otomatis Python telah digunakan untuk memecah RE menjadi bagian-bagian yang lebih kecil, tetapi masih lebih sulit untuk dipahami daripada versi yang menggunakan Lebih Banyak Kekuatan PolaSejauh ini kami hanya membahas sebagian dari fitur ekspresi reguler. Di bagian ini, kami akan membahas beberapa karakter meta baru, dan cara menggunakan grup untuk mengambil bagian teks yang cocok Lebih Banyak MetakarakterAda beberapa karakter meta yang belum kami bahas. Sebagian besar dari mereka akan dibahas di bagian ini Beberapa karakter meta yang tersisa untuk didiskusikan adalah pernyataan dengan lebar nol. Mereka tidak menyebabkan mesin maju melalui tali; . Misalnya, >>> p = re.compile('ab*', re.IGNORECASE)_52 adalah pernyataan bahwa posisi saat ini terletak di batas kata; . Ini berarti bahwa pernyataan dengan lebar nol tidak boleh diulang, karena jika mereka cocok sekali di lokasi tertentu, mereka jelas dapat dicocokkan berkali-kali. >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_11 Pergantian, atau operator "atau". Jika A dan B adalah ekspresi reguler, >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')12 akan cocok dengan string apa pun yang cocok dengan A atau B. >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_11 memiliki prioritas yang sangat rendah untuk membuatnya berfungsi secara wajar saat Anda mengganti string multi-karakter. >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_14 akan cocok dengan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')15 atau >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')16, bukan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')17, >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')18 atau >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')19, dan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')20 Untuk mencocokkan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')21 literal, gunakan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')22, atau sertakan di dalam kelas karakter, seperti pada >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')23 >>> p = re.compile('ab*', re.IGNORECASE)_64 Cocok di awal baris. Kecuali bendera >>> p = re.compile('ab*', re.IGNORECASE)62 telah ditetapkan, ini hanya akan cocok di awal string. Dalam mode >>> p = re.compile('ab*', re.IGNORECASE)_62, ini juga cocok segera setelah setiap baris baru dalam string Misalnya, jika Anda ingin mencocokkan kata >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')27 hanya di awal baris, RE yang digunakan adalah >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')28 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_4 Untuk mencocokkan >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)_7 literal, gunakan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')30 >>> p = re.compile('ab*', re.IGNORECASE)_65 Cocok di akhir baris, yang didefinisikan sebagai akhir string, atau lokasi apa pun yang diikuti oleh karakter baris baru >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')5 Untuk mencocokkan >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)5 literal, gunakan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')33 atau sertakan di dalam kelas karakter, seperti pada >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')34 >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_35 Cocok hanya di awal string. Saat tidak dalam mode >>> p = re.compile('ab*', re.IGNORECASE)62, >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')35 dan >>> p = re.compile('ab*', re.IGNORECASE)64 secara efektif sama. Dalam mode >>> p = re.compile('ab*', re.IGNORECASE)_62, keduanya berbeda. >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_35 masih cocok hanya di awal string, tapi >>> p = re.compile('ab*', re.IGNORECASE)64 mungkin cocok di setiap lokasi di dalam string yang mengikuti karakter baris baru >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_42 Cocok hanya di akhir string >>> p = re.compile('ab*', re.IGNORECASE)_52 Batas kata. Ini adalah pernyataan dengan lebar nol yang hanya cocok di awal atau akhir kata. Kata didefinisikan sebagai urutan karakter alfanumerik, sehingga akhir kata ditunjukkan dengan spasi putih atau karakter non-alfanumerik Contoh berikut cocok dengan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_44 hanya jika itu adalah kata yang lengkap; >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_6 Ada dua kehalusan yang harus Anda ingat saat menggunakan urutan khusus ini. Pertama, ini adalah tabrakan terburuk antara string literal Python dan urutan ekspresi reguler. Dalam literal string Python, >>> p = re.compile('ab*', re.IGNORECASE)52 adalah karakter backspace, nilai ASCII 8. Jika Anda tidak menggunakan string mentah, maka Python akan mengonversi >>> p = re.compile('ab*', re.IGNORECASE)52 menjadi backspace, dan RE Anda tidak akan cocok seperti yang Anda harapkan. Contoh berikut terlihat sama dengan RE kita sebelumnya, tetapi menghilangkan >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')85 di depan string RE >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_7 Kedua, di dalam kelas karakter, di mana tidak ada gunanya untuk pernyataan ini, >>> p = re.compile('ab*', re.IGNORECASE)52 mewakili karakter backspace, untuk kompatibilitas dengan string literal Python >>> p = re.compile('ab*', re.IGNORECASE)_82 Penegasan lebar nol lainnya, ini kebalikan dari >>> p = re.compile('ab*', re.IGNORECASE)52, hanya cocok jika posisi saat ini tidak berada pada batas kata PengelompokanSeringkali Anda perlu mendapatkan informasi lebih dari sekadar apakah RE cocok atau tidak. Ekspresi reguler sering digunakan untuk membedah string dengan menulis RE yang dibagi menjadi beberapa subgrup yang cocok dengan komponen minat yang berbeda. Misalnya, baris header RFC-822 dibagi menjadi nama header dan nilai, dipisahkan oleh >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_51, seperti ini >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_8 Ini dapat ditangani dengan menulis ekspresi reguler yang cocok dengan seluruh baris tajuk, dan memiliki satu grup yang cocok dengan nama tajuk, dan grup lain yang cocok dengan nilai tajuk Grup ditandai dengan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_52, >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')53 metakarakter. >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_52 dan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')53 memiliki banyak arti yang sama seperti yang mereka lakukan dalam ekspresi matematika; . Misalnya, >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_60 akan cocok dengan nol atau lebih pengulangan dari >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')61 >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_9 Grup yang ditunjukkan dengan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')52, >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')53 juga menangkap indeks awal dan akhir teks yang cocok; . Grup diberi nomor mulai dari 0. Grup 0 selalu hadir; . Nanti kita akan melihat cara mengekspresikan grup yang tidak menangkap rentang teks yang cocok >>> p = re.compile('ab*', re.IGNORECASE)_0 Subkelompok diberi nomor dari kiri ke kanan, dari 1 ke atas. Grup dapat disarangkan; >>> p = re.compile('ab*', re.IGNORECASE)_1 dapat melewati beberapa nomor grup sekaligus, dalam hal ini akan mengembalikan tuple yang berisi nilai yang sesuai untuk grup tersebut >>> p = re.compile('ab*', re.IGNORECASE)_2 Metode ini mengembalikan tuple yang berisi string untuk semua subgrup, dari 1 hingga berapa pun jumlahnya >>> p = re.compile('ab*', re.IGNORECASE)_3 Referensi balik dalam sebuah pola memungkinkan Anda menentukan bahwa konten dari grup penangkap sebelumnya juga harus ditemukan di lokasi saat ini dalam string. Misalnya, >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')70 akan berhasil jika konten persis grup 1 dapat ditemukan di posisi saat ini, dan gagal sebaliknya. Ingat bahwa literal string Python juga menggunakan garis miring terbalik diikuti dengan angka untuk memungkinkan menyertakan karakter arbitrer dalam string, jadi pastikan untuk menggunakan string mentah saat memasukkan referensi balik dalam RE Misalnya, RE berikut mendeteksi kata ganda dalam sebuah string >>> p = re.compile('ab*', re.IGNORECASE)_4 Referensi balik seperti ini seringkali tidak berguna hanya untuk menelusuri string — ada beberapa format teks yang mengulangi data dengan cara ini — tetapi Anda akan segera mengetahui bahwa referensi tersebut sangat berguna saat melakukan penggantian string Non-menangkap dan Grup BernamaRE yang rumit dapat menggunakan banyak grup, baik untuk menangkap substring yang diminati, maupun untuk mengelompokkan dan menyusun RE itu sendiri. Dalam RES kompleks, menjadi sulit untuk melacak nomor grup. Ada dua fitur yang membantu mengatasi masalah ini. Keduanya menggunakan sintaks umum untuk ekstensi ekspresi reguler, jadi kita akan melihatnya terlebih dahulu Perl 5 terkenal dengan penambahannya yang kuat pada ekspresi reguler standar. Untuk fitur baru ini, pengembang Perl tidak dapat memilih metakarakter penekanan tombol tunggal baru atau urutan khusus baru yang dimulai dengan >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)0 tanpa membuat ekspresi reguler Perl berbeda secara membingungkan dari RE standar. Jika mereka memilih >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')72 sebagai karakter meta baru, misalnya, ekspresi lama akan mengasumsikan bahwa >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')72 adalah karakter biasa dan tidak akan menghindarinya dengan menulis >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')74 atau >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')75 Solusi yang dipilih oleh pengembang Perl adalah menggunakan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')76 sebagai sintaks ekstensi. >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_47 segera setelah tanda kurung adalah kesalahan sintaksis karena >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')47 tidak akan mengulangi apa pun, jadi ini tidak menimbulkan masalah kompatibilitas. Karakter segera setelah >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_47 menunjukkan ekstensi apa yang digunakan, jadi >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')80 adalah satu hal (pernyataan lookahead positif) dan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')81 adalah sesuatu yang lain (grup non-menangkap yang berisi subekspresi >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')82) Python mendukung beberapa ekstensi Perl dan menambahkan sintaks ekstensi ke sintaks ekstensi Perl. Jika karakter pertama setelah tanda tanya adalah >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')83, Anda tahu bahwa itu adalah ekstensi khusus untuk Python Sekarang setelah kita melihat sintaks ekstensi umum, kita dapat kembali ke fitur yang menyederhanakan bekerja dengan grup dalam RE yang kompleks Terkadang Anda ingin menggunakan grup untuk menunjukkan bagian dari ekspresi reguler, tetapi tidak tertarik untuk mengambil konten grup. Anda dapat memperjelas fakta ini dengan menggunakan grup yang tidak menangkap. >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_84, tempat Anda dapat mengganti >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')85 dengan ekspresi reguler lainnya >>> p = re.compile('ab*', re.IGNORECASE)_5 Kecuali fakta bahwa Anda tidak dapat mengambil konten dari grup yang cocok, grup yang tidak menangkap berperilaku persis sama dengan grup yang menangkap; . >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_84 sangat berguna saat memodifikasi pola yang ada, karena Anda dapat menambahkan grup baru tanpa mengubah cara semua grup lain diberi nomor. Harus disebutkan bahwa tidak ada perbedaan performa dalam pencarian antara grup yang menangkap dan yang tidak menangkap; Fitur yang lebih signifikan adalah grup bernama. alih-alih merujuknya dengan angka, grup dapat direferensikan dengan nama Sintaks untuk grup bernama adalah salah satu ekstensi khusus Python. >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_88. nama, jelas, nama grup. Grup bernama berperilaku persis seperti menangkap grup, dan juga mengaitkan nama dengan grup. Metode yang menangani grup penangkap semuanya menerima bilangan bulat yang merujuk ke grup dengan angka atau string yang berisi nama grup yang diinginkan. Grup bernama masih diberi nomor, jadi Anda bisa mengambil informasi tentang grup dengan dua cara >>> p = re.compile('ab*', re.IGNORECASE)_6 Selain itu, Anda dapat mengambil grup bernama sebagai kamus dengan >>> p = re.compile('ab*', re.IGNORECASE)_7 Grup bernama berguna karena memungkinkan Anda menggunakan nama yang mudah diingat, alih-alih harus mengingat angka. Berikut adalah contoh RE dari modul >>> p = re.compile('ab*', re.IGNORECASE)_8 Jelas jauh lebih mudah untuk mengambil >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')91, daripada harus ingat untuk mengambil grup 9 Sintaks untuk referensi balik dalam ekspresi seperti >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')92 mengacu pada nomor grup. Tentu saja ada varian yang menggunakan nama grup, bukan nomor. Ini adalah ekstensi Python lainnya. >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_93 menunjukkan bahwa isi grup yang disebut nama harus dicocokkan lagi pada titik saat ini. Ekspresi reguler untuk menemukan kata ganda, >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')94 juga dapat ditulis sebagai >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')95 >>> p = re.compile('ab*', re.IGNORECASE)_9 Pernyataan Lihat ke DepanPenegasan lebar nol lainnya adalah pernyataan lookahead. Penegasan lookahead tersedia dalam bentuk positif dan negatif, dan terlihat seperti ini >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_96 Penegasan lookahead positif. Ini berhasil jika ekspresi reguler yang terkandung, diwakili di sini oleh >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')85, berhasil cocok di lokasi saat ini, dan gagal sebaliknya. Tapi, begitu ekspresi yang terkandung dicoba, mesin pencocokan tidak maju sama sekali; >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_98 Penegasan lookahead negatif. Ini kebalikan dari pernyataan positif; Untuk membuatnya konkret, mari kita lihat kasus di mana lookahead berguna. Pertimbangkan pola sederhana untuk mencocokkan nama file dan pisahkan menjadi nama dasar dan ekstensi, dipisahkan oleh >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')00. Misalnya, di >>> p.match("") >>> print(p.match("")) None00, >>> p.match("") >>> print(p.match("")) None01 adalah nama dasar, dan >>> p.match("") >>> print(p.match("")) None02 adalah ekstensi nama file Pola untuk mencocokkan ini cukup sederhana >>> p.match("") >>> print(p.match("")) None_03 Perhatikan bahwa >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_00 perlu diperlakukan secara khusus karena itu adalah metakarakter, jadi di dalam kelas karakter hanya cocok dengan karakter tertentu itu. Perhatikan juga tanda >>> p = re.compile('ab*', re.IGNORECASE)_65; . Ekspresi reguler ini cocok dengan >>> p.match("") >>> print(p.match("")) None06 dan >>> p.match("") >>> print(p.match("")) None07 dan >>> p.match("") >>> print(p.match("")) None08 dan >>> p.match("") >>> print(p.match("")) None09 Sekarang, pertimbangkan untuk sedikit memperumit masalah; >>> p.match("") >>> print(p.match("")) None11 Upaya pertama di atas mencoba untuk mengecualikan >>> p.match("") >>> print(p.match("")) None10 dengan mengharuskan karakter pertama dari ekstensi bukan >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>6. Ini salah, karena polanya juga tidak cocok >>> p.match("") >>> print(p.match("")) None06 >>> p.match("") >>> print(p.match("")) None_15 Ekspresi menjadi lebih berantakan ketika Anda mencoba menambal solusi pertama dengan meminta salah satu kasus berikut untuk dicocokkan. karakter pertama ekstensi bukan >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>6; . Ini menerima >>> p.match("") >>> print(p.match("")) None_06 dan menolak >>> p.match("") >>> print(p.match("")) None07, tetapi membutuhkan ekstensi tiga huruf dan tidak akan menerima nama file dengan ekstensi dua huruf seperti >>> p.match("") >>> print(p.match("")) None08. Kami akan memperumit pola lagi dalam upaya untuk memperbaikinya >>> p.match("") >>> print(p.match("")) None_22 Pada upaya ketiga, huruf kedua dan ketiga semuanya dibuat opsional untuk memungkinkan pencocokan ekstensi yang lebih pendek dari tiga karakter, seperti >>> p.match("") >>> print(p.match("")) None08 Polanya menjadi sangat rumit sekarang, yang membuatnya sulit untuk dibaca dan dipahami. Lebih buruk lagi, jika masalahnya berubah dan Anda ingin mengecualikan >>> p.match("") >>> print(p.match("")) None10 dan >>> p.match("") >>> print(p.match("")) None25 sebagai ekstensi, polanya akan menjadi lebih rumit dan membingungkan Pandangan ke depan yang negatif memotong semua kebingungan ini >>> p.match("") >>> print(p.match("")) None26 Arti pandangan ke depan negatif. jika ekspresi >>> p.match("") >>> print(p.match("")) None10 tidak cocok pada titik ini, coba sisa polanya; . Trailing >>> p = re.compile('ab*', re.IGNORECASE)65 diperlukan untuk memastikan bahwa sesuatu seperti >>> p.match("") >>> print(p.match("")) None30, di mana ekstensi hanya dimulai dengan >>> p.match("") >>> print(p.match("")) None10, akan diizinkan. >>> p.match("") >>> print(p.match("")) None32 memastikan bahwa pola tersebut berfungsi saat ada banyak titik di nama file Mengecualikan ekstensi nama file lain kini menjadi mudah; . Pola berikut mengecualikan nama file yang diakhiri dengan >>> p.match("") >>> print(p.match("")) None10 atau >>> p.match("") >>> print(p.match("")) None25 >>> p.match("") >>> print(p.match("")) None_35 Memodifikasi StringHingga saat ini, kami hanya melakukan penelusuran terhadap string statis. Ekspresi reguler juga biasa digunakan untuk memodifikasi string dengan berbagai cara, menggunakan metode pola berikut Metode/Atribut Tujuan >>> p.match("") >>> print(p.match("")) None_36 Pisahkan string menjadi daftar, pisahkan di mana pun RE cocok >>> p = re.compile('ab*', re.IGNORECASE)_39 Temukan semua substring di mana RE cocok, dan ganti dengan string yang berbeda >>> p.match("") >>> print(p.match("")) None_38 Melakukan hal yang sama seperti >>> p = re.compile('ab*', re.IGNORECASE)39, tetapi mengembalikan string baru dan jumlah penggantian Pemisahan StringMetode pola memisahkan string di mana pun RE cocok, mengembalikan daftar potongan. Ini mirip dengan metode string tetapi memberikan lebih banyak keumuman dalam pembatas yang dapat Anda pisahkan; . Seperti yang Anda harapkan, ada juga fungsi tingkat modul . pisah(string[ , maxsplit=0])Pisahkan string dengan kecocokan ekspresi reguler. Jika tanda kurung penangkap digunakan dalam RE, maka isinya juga akan dikembalikan sebagai bagian dari daftar yang dihasilkan. Jika maxsplit bukan nol, paling banyak maxsplit split dilakukan Anda dapat membatasi jumlah pemisahan yang dilakukan, dengan memberikan nilai untuk pemisahan maksimal. Ketika maxsplit bukan nol, paling banyak pemisahan maxsplit akan dibuat, dan sisa string dikembalikan sebagai elemen terakhir dari daftar. Dalam contoh berikut, pembatas adalah urutan karakter non-alfanumerik >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_0 Terkadang Anda tidak hanya tertarik dengan teks di antara pembatas, tetapi juga perlu mengetahui pembatas itu. Jika menangkap tanda kurung digunakan dalam RE, maka nilainya juga dikembalikan sebagai bagian dari daftar. Bandingkan panggilan berikut >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_1 Fungsi tingkat modul menambahkan RE untuk digunakan sebagai argumen pertama, tetapi sebaliknya sama >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_2 Cari dan GantiTugas umum lainnya adalah menemukan semua kecocokan untuk sebuah pola, dan menggantinya dengan string yang berbeda. Metode mengambil nilai pengganti, yang bisa berupa string atau fungsi, dan string yang akan diproses . sub(pengganti , string[, count=0])Mengembalikan string yang diperoleh dengan mengganti kejadian RE yang tidak tumpang tindih paling kiri dalam string dengan penggantian pengganti. Jika pola tidak ditemukan, string dikembalikan tanpa perubahan Hitungan argumen opsional adalah jumlah maksimum kemunculan pola yang akan diganti; . Nilai default 0 berarti mengganti semua kejadian Berikut adalah contoh sederhana penggunaan metode ini. Ini menggantikan nama warna dengan kata >>> p.match("") >>> print(p.match("")) None47 >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_3 Metode melakukan pekerjaan yang sama, tetapi mengembalikan 2-tuple yang berisi nilai string baru dan jumlah penggantian yang dilakukan >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_4 Pencocokan kosong diganti hanya jika tidak bersebelahan dengan pencocokan kosong sebelumnya >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_5 Jika penggantian adalah string, garis miring terbalik apa pun yang lolos di dalamnya akan diproses. Yaitu, >>> p.match("") >>> print(p.match("")) None_49 diubah menjadi satu karakter baris baru, >>> p.match("") >>> print(p.match("")) None50 diubah menjadi carriage return, dan seterusnya. Pelarian yang tidak diketahui seperti >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_74 dibiarkan sendiri. Referensi balik, seperti >>> p.match("") >>> print(p.match("")) None_52, diganti dengan substring yang cocok dengan grup yang sesuai di RE. Ini memungkinkan Anda menggabungkan bagian dari teks asli dalam string pengganti yang dihasilkan Contoh ini cocok dengan kata >>> p.match("") >>> print(p.match("")) None53 diikuti dengan string yang disertakan dalam >>> p.match("") >>> print(p.match("")) None54, >>> p.match("") >>> print(p.match("")) None55, dan mengubah >>> p.match("") >>> print(p.match("")) None53 menjadi >>> p.match("") >>> print(p.match("")) None57 >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_6 Ada juga sintaks untuk merujuk ke grup bernama seperti yang didefinisikan oleh sintaks ________147______88. >>> p.match("") >>> print(p.match("")) None_59 akan menggunakan substring yang cocok dengan grup bernama >>> p.match("") >>> print(p.match("")) None60, dan >>> p.match("") >>> print(p.match("")) None61 menggunakan nomor grup yang sesuai. >>> p.match("") >>> print(p.match("")) None_62 oleh karena itu setara dengan >>> p.match("") >>> print(p.match("")) None63, tetapi tidak ambigu dalam string pengganti seperti >>> p.match("") >>> print(p.match("")) None64. ( >>> p.match("") >>> print(p.match("")) None65 akan ditafsirkan sebagai referensi ke grup 20, bukan referensi ke grup 2 diikuti oleh karakter literal >>> p.match("") >>> print(p.match("")) None66. ) Substitusi berikut semuanya setara, tetapi gunakan ketiga variasi string pengganti >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_7 penggantian juga bisa menjadi fungsi, yang memberi Anda lebih banyak kendali. Jika penggantian adalah sebuah fungsi, fungsi tersebut dipanggil untuk setiap kemunculan pola yang tidak tumpang tindih. Pada setiap pemanggilan, fungsi diberikan argumen untuk kecocokan dan dapat menggunakan informasi ini untuk menghitung string pengganti yang diinginkan dan mengembalikannya Dalam contoh berikut, fungsi penggantian menerjemahkan desimal menjadi heksadesimal >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_8 Saat menggunakan fungsi tingkat modul, pola diteruskan sebagai argumen pertama. Pola dapat diberikan sebagai objek atau sebagai string; . g. >>> p.match("") >>> print(p.match("")) None_68 mengembalikan >>> p.match("") >>> print(p.match("")) None69 Masalah umumEkspresi reguler adalah alat yang ampuh untuk beberapa aplikasi, tetapi dalam beberapa hal perilakunya tidak intuitif dan terkadang tidak berperilaku seperti yang Anda harapkan. Bagian ini akan menunjukkan beberapa jebakan yang paling umum Gunakan Metode StringTerkadang menggunakan modul adalah suatu kesalahan. Jika Anda mencocokkan string tetap, atau kelas karakter tunggal, dan Anda tidak menggunakan fitur apa pun seperti bendera, maka kekuatan penuh dari ekspresi reguler mungkin tidak diperlukan. String memiliki beberapa metode untuk melakukan operasi dengan string tetap dan biasanya jauh lebih cepat, karena penerapannya adalah loop C kecil tunggal yang telah dioptimalkan untuk tujuan tersebut, bukan mesin ekspresi reguler yang besar dan lebih umum. Salah satu contoh mungkin mengganti satu string tetap dengan yang lain; . sepertinya fungsi yang digunakan untuk ini, tetapi pertimbangkan metodenya. Perhatikan bahwa >>> p.match("") >>> print(p.match("")) None_76 juga akan menggantikan >>> p.match("") >>> print(p.match("")) None73 di dalam kata-kata, mengubah >>> p.match("") >>> print(p.match("")) None79 menjadi >>> p.match("") >>> print(p.match("")) None80, tetapi RE naif >>> p.match("") >>> print(p.match("")) None73 akan melakukan itu juga. (Untuk menghindari melakukan substitusi pada bagian kata, polanya harus >>> p.match("") >>> print(p.match("")) None82, untuk mensyaratkan bahwa >>> p.match("") >>> print(p.match("")) None73 memiliki batas kata di kedua sisi. Ini mengambil pekerjaan di luar kemampuan >>> p.match("") >>> print(p.match("")) None_76. ) Tugas umum lainnya adalah menghapus setiap kemunculan karakter tunggal dari sebuah string atau menggantinya dengan karakter tunggal lainnya. Anda mungkin melakukan ini dengan sesuatu seperti >>> p.match("") >>> print(p.match("")) None_85, tetapi mampu melakukan kedua tugas dan akan lebih cepat daripada operasi ekspresi reguler apa pun Singkatnya, sebelum beralih ke modul, pertimbangkan apakah masalah Anda dapat diselesaikan dengan metode string yang lebih cepat dan sederhana cocok() versus pencarian()Fungsi hanya memeriksa apakah RE cocok di awal string sementara akan memindai ke depan melalui string untuk mencari kecocokan. Penting untuk mengingat perbedaan ini. Ingat, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')_99 hanya akan melaporkan pertandingan sukses yang akan dimulai dari 0; >>> import re >>> p = re.compile('[a-z]+') >>> p re.compile('[a-z]+')_9 Di sisi lain, akan memindai ke depan melalui string, melaporkan kecocokan pertama yang ditemukannya >>> p.match("") >>> print(p.match("")) None0 Terkadang Anda akan tergoda untuk tetap menggunakan , dan tambahkan saja >>> p.match("") >>> print(p.match("")) None94 ke depan RE Anda. Tahan godaan ini dan gunakan sebagai gantinya. Kompiler ekspresi reguler melakukan beberapa analisis RE untuk mempercepat proses pencarian kecocokan. Salah satu analisis semacam itu menentukan karakter pertama dari suatu pertandingan; . Analisis memungkinkan mesin dengan cepat memindai melalui string mencari karakter awal, hanya mencoba kecocokan penuh jika >>> p.match("") >>> print(p.match("")) None97 ditemukan Menambahkan >>> p.match("") >>> print(p.match("")) None_94 mengalahkan pengoptimalan ini, membutuhkan pemindaian hingga akhir string dan kemudian mundur untuk menemukan kecocokan untuk sisa RE. Gunakan sebagai gantinya Serakah versus Tidak SerakahSaat mengulangi ekspresi reguler, seperti pada >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>01, tindakan yang dihasilkan adalah menggunakan pola sebanyak mungkin. Fakta ini sering mengganggu Anda saat Anda mencoba mencocokkan sepasang pembatas yang seimbang, seperti tanda kurung sudut yang mengelilingi tag HTML. Pola naif untuk mencocokkan satu tag HTML tidak berfungsi karena sifat serakah dari >>> p.match("") >>> print(p.match("")) None94 >>> p.match("") >>> print(p.match("")) None_1 RE cocok dengan >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>03 di >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>04, dan >>> p.match("") >>> print(p.match("")) None94 menggunakan sisa string. Namun, masih ada lagi yang tersisa di RE, dan >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>06 tidak dapat cocok di akhir string, jadi mesin ekspresi reguler harus mundur karakter demi karakter hingga menemukan kecocokan untuk >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>06. Pertandingan final dimulai dari >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>_03 di >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>04 hingga >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>10 di >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>11, yang bukan itu yang Anda inginkan Dalam hal ini, solusinya adalah dengan menggunakan pembilang non-rakus >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>12, >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>13, >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>14, atau >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>15, yang cocok dengan teks sesedikit mungkin. Dalam contoh di atas, >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>_10 dicoba segera setelah >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>_03 pertama cocok, dan ketika gagal, mesin memajukan karakter pada satu waktu, mencoba lagi >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>10 di setiap langkah. Ini menghasilkan hasil yang tepat >>> p.match("") >>> print(p.match("")) None_2 (Perhatikan bahwa mem-parsing HTML atau XML dengan ekspresi reguler itu menyakitkan. Pola cepat dan kotor akan menangani kasus umum, tetapi HTML dan XML memiliki kasus khusus yang akan merusak ekspresi reguler yang jelas; . Gunakan modul pengurai HTML atau XML untuk tugas semacam itu. ) Menggunakan re. VERBOSESekarang Anda mungkin telah memperhatikan bahwa ekspresi reguler adalah notasi yang sangat ringkas, tetapi tidak terlalu mudah dibaca. RE dengan kompleksitas sedang dapat menjadi kumpulan garis miring terbalik, tanda kurung, dan karakter meta yang panjang, membuatnya sulit untuk dibaca dan dipahami Untuk RE seperti itu, menentukan flag saat mengompilasi ekspresi reguler dapat membantu, karena memungkinkan Anda untuk memformat ekspresi reguler dengan lebih jelas Bendera >>> p = re.compile('ab*', re.IGNORECASE)_44 memiliki beberapa efek. Spasi kosong dalam ekspresi reguler yang tidak ada di dalam kelas karakter akan diabaikan. Ini berarti ekspresi seperti >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>_21 setara dengan >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>22 yang kurang mudah dibaca, tetapi >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>23 akan tetap cocok dengan karakter >>> m.group() 'tempo' >>> m.start(), m.end() (0, 5) >>> m.span() (0, 5)2, >>> import re >>> p = re.compile('ab*') >>> p re.compile('ab*')17, atau spasi. Selain itu, Anda juga dapat memasukkan komentar ke dalam RE; . Saat digunakan dengan string dengan kutip tiga, ini memungkinkan RE diformat dengan lebih rapi >>> p.match("") >>> print(p.match("")) None_3 Ini jauh lebih mudah dibaca daripada >>> p.match("") >>> print(p.match("")) None_4 MasukanEkspresi reguler adalah topik yang rumit. Apakah dokumen ini membantu Anda memahaminya? Buku terlengkap tentang ekspresi reguler hampir pasti adalah Mastering Regular Expressions karya Jeffrey Friedl, diterbitkan oleh O'Reilly. Sayangnya, ini secara eksklusif berkonsentrasi pada ekspresi reguler Perl dan Java, dan tidak mengandung materi Python sama sekali, sehingga tidak akan berguna sebagai referensi untuk pemrograman dengan Python. (Edisi pertama mencakup modul >>> m = p.match('tempo') >>> m <re.Match object; span=(0, 5), match='tempo'>27 Python yang sekarang sudah dihapus, yang tidak akan banyak membantu Anda. ) Pertimbangkan untuk memeriksanya dari perpustakaan Anda Bagaimana Anda menemukan kecocokan antara dua string dengan Python?Anda dapat membandingkan string dengan Python menggunakan persamaan ( == ) dan perbandingan ( < , > ,. = , . Tidak ada metode khusus untuk membandingkan dua string. Dalam artikel ini, Anda akan mempelajari cara kerja masing-masing operator saat membandingkan string.
Bagaimana cara menemukan pola yang cocok dengan Python?Cara melakukan pencocokan pola dengan Python . Menggunakan re. fungsi pencarian() Menggunakan re. pertandingan() Fungsi Menggunakan re. fullmatch() Fungsi Menggunakan re. findall() Fungsi Menggunakan re. finditer() Fungsi Bagaimana cara mengekstrak pola tertentu dari sebuah string dengan Python?Gunakan kembali. search() untuk mengekstrak substring yang cocok dengan pola ekspresi reguler . Tentukan pola ekspresi reguler sebagai parameter pertama dan string target sebagai parameter kedua. \d cocok dengan karakter digit, dan + cocok dengan satu atau lebih pengulangan dari pola sebelumnya.
Bagaimana cara mengekstrak teks antara dua karakter di Python regex?Cara Mencocokkan teks antara dua string dengan regex di Python . ulang. . import re s = 'langkah 1 beberapa teks langkah 2 lebih banyak teks langkah 3 lalu lebih banyak teks' re. . ulang. . import re s = 'langkah 1 beberapa teks\nlangkah 2 lebih banyak teks\nlangkah 3 lalu lebih banyak teks\nkesimpulan' re. . s = ". firstmail@some. beberapa;. secondmail@some. beberapa;. beberapa email @ beberapa. som;" re |