Kami melewati tantangan RegexPlay 100%

Tantangan dari Machine Learning Lab dari University of Trieste (Italia) menawarkan untuk menyelesaikan 12 masalah dan tingkat tugas sangat bervariasi - dari yang super mudah hingga yang sulit.


Tentu saja, mungkin ada lebih dari satu solusi, dan uji kasus dalam masalah tidak mencakup semua opsi. Namun demikian, jika Anda mendapat skor 100%, maka selamat! Tes berlalu.


Spoiler: dalam beberapa tugas (terutama yang ringan), sebuah petunjuk praktis merupakan solusi.


Tugas 1 - cari nomornya


Ada teks yang berisi angka, Anda perlu menemukan semua angka.


Kesulitan: sangat mudah.


Petunjuk

Anda perlu menggunakan karakter digit dan kuantifier pengali.


Solusi
\ d +

"[0-9] +" juga merupakan keputusan yang tepat.


Solusi parsing
  • "\ d" atau "[0-9]" - karakter tunggal apa pun dari 0 hingga 9.
  • "+" - satu atau lebih karakter diperbolehkan.

Tugas 2 - temukan alamat mac


Ada teks yang berisi alamat mac, Anda harus menemukannya.


Kesulitan: mudah.


Petunjuk

Anda perlu menggunakan karakter yang berarti karakter huruf atau angka apa pun, tanda titik dua untuk memisahkan, dan kuantifier pengali.


Solusi
\ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}: \ w {2}

"+" bukan "{2}" juga merupakan keputusan yang tepat, meskipun tidak sepenuhnya akurat.


Solusi parsing
  • "\ w" adalah karakter apa pun dalam alfabet atau angka apa pun.
  • "{2}" - hanya 2 karakter yang diizinkan.

Solusi terbaik

Mereka yang akrab dengan alamat mac telah memperhatikan bahwa alamat mac ditulis dalam notasi heksadesimal. Dan dalam solusi sebelumnya, tanda \ w digunakan, yang berarti karakter apa pun dari alfabet dan semua angka. Saya setuju, mungkin ini tidak perlu, tetapi Anda dapat mempertimbangkan ini, sekaligus mengurangi keteraturan.


([\ da-f] {2} :) {5} [\ da-f] {2}

Solusi parsing
  • "\ d" adalah angka tunggal, "af" adalah rentang dari a hingga f. Secara total, kami memiliki set karakter yang valid 0123456789abcdef - yaitu kode hexadecimal Hex. "{2}" - 2 karakter apa pun dari rangkaian karakter ini.
  • "([\ da-f] {2} :)" {5} - pengulangan dua karakter hex + colon diperbolehkan tepat 5 kali.
  • dan di akhir "[\ da-f] {2}" - setiap 2 karakter dari heks himpunan

Tugas 3 - temukan alamat ftp


Ada teks dengan alamat ftp, Anda perlu menemukannya.


Kesulitan: mudah.


Petunjuk

Anda harus mulai dengan ftp: // dan kemudian daftar karakter yang valid di alamat, bukan melupakan pengali pengali.


Solusi
ftp: \ / \ / [\ w \ d -_. \ /] +

Solusi parsing
  • "\ /" - pelolosan karakter "/" yang normal.
  • kurung dalam adalah enumerasi karakter yang valid, yaitu, setiap karakter dalam alfabet atau angka apa pun, tanda hubung, garis bawah, titik atau garis miring (jika ada karakter lain dalam nama, Anda dapat menambahkannya).

Tugas 4 - temukan templat


Ada beberapa jenis file yang diformat di mana Anda perlu menemukan semua baris yang cocok dengan pola $ setiap karakter $.


Kesulitan: mudah.


Petunjuk

Anda perlu menggunakan pelarian dari karakter yang dipesan, karakter dari karakter apa saja, penjumlah multiplisitas, dan malas.


Solusi

Tugas yang lumrah, tetapi membutuhkan sedikit pengetahuan yang lebih baik tentang pelanggan tetap.


\\ $. +? \\ $

Solusi parsing
  • "\\ $" adalah penyaringan dolar.
  • ". +" - jumlah karakter apa saja, "?" - hapus keserakahan.

Tugas 5 - temukan alamat ip


Temukan alamat ip dari teks.


Kesulitan: mudah.


Petunjuk

Sangat mirip dengan tugas kedua.


Solusi
\ d + \. \ d + \. \ d + \. \ d +

Jika alih-alih "+" Anda menulis "{1,3}" maka Anda selesai.


Solusi parsing
  • "\ d" adalah angka tunggal,
  • "+" - jumlah karakter apa pun, "{1,3}" - batasan ketat pada jumlah karakter (dari 1 hingga 3).

Solusi terbaik

Alamat IP bukan hanya angka, tetapi angka dari 0 hingga 255.


\ b ((\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \.) {3} (\ d | [1 -9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]) \ b

Solusi parsing

Untuk menentukan rentang dari 0 hingga 255 Anda harus mencoba sedikit:


  • "\ d" adalah angka dari 0 hingga 9
  • "[1-9] \ d" - angka dari 10 hingga 99
  • "1 \ d {2}" - angka dari 100 hingga 199
  • "2 [0-4] \ d" - angka dari 200 hingga 249
  • "25 [0-5]" - chilso mulai 250 hingga 255

Selanjutnya, kami mengizinkan pengulangan pola digit dari 0 hingga 255 tepat 3 kali:


  • "(\ d | [1-9] \ d | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]).) {3}" - di dalam titik, karena juga diulang 3 kali dan pada akhirnya rentang angka yang sama, tetapi tanpa titik.
  • di akhir dan awal kita menambahkan simbol perbatasan kata "\ b" - diperlukan untuk menghapus teks "1172.30.42.109" dari entri (saya setuju, itu tidak mungkin dan mungkin tidak perlu).

Tugas 6 - Jangkar


Tarik tag href dari dokumen html.


Kesulitan: sedang.


Petunjuk

Gunakan "karakter apa pun kecuali" dan "atau" untuk setiap tanda kurung.


Solusi
href = ("[^"] + "| '[^'] + ')

Solusi parsing
  • "- mulai pencarian dengan penawaran ganda.
  • "[^"] + "- lebih jauh benar-benar karakter apa pun kecuali kutipan ganda.
  • Kami diakhiri dengan penawaran ganda.

Kami menempatkan semua ini di dalam tanda kurung, menambahkan tanda atau - "|" dan ulangi hal yang sama untuk tanda kutip tunggal.


Tugas 7 - Tautan


Dalam teks apa pun temukan semua tautan. Tugas ini rumit oleh fakta bahwa itu tidak cukup hanya untuk menemukan tautan, Anda harus membuang karakter yang tidak valid dari akhir.


Kesulitan: sulit.


Petunjuk

Anda harus mulai dengan http, gunakan "karakter apa saja kecuali" dan akhiri pencarian dengan karakter yang valid.


Solusi
http: \ / \ / ([^> \ s] +) [\ w \ /]

Tidak ada tautan https dalam tugas, tetapi Anda dapat mempertimbangkan ini dengan menambahkan "s?" setelah http.


Solusi parsing
  • "[^> \ s] +" mencari karakter apa pun kecuali karakter ">" dan karakter spasi. Bahkan, Anda dapat membaca seperti ini "kita pergi sampai kita melihat salah satu simbol ini."
  • "[\ w \ /]" adalah pembatas yang memungkinkan tautan berakhir dengan hanya karakter Latin atau garis miring.

Dan sebagai hasilnya - kita mulai dengan http: //, kemudian benar-benar karakter apa pun kecuali karakter "<" atau spasi, tetapi pada akhirnya diperlukan karakter Latin atau garis miring.


  • ekstra "s?" di "https?" izinkan saja "http: //" dan "https: //".

Tugas 8 - Tajuk


Dalam HTML, header adalah tag h + digit.


Kesulitan: sedang.


Petunjuk

Mulai dengan h + digit + karakter apa pun atau ketidakhadirannya.


Solusi

Cukup sederhana:


<h \ d. *>. * <\ / h \ d. *>

Solusi parsing
  • "h \ d" - di sini kita mengatakan bahwa setelah karakter harus selalu pergi digit "\ d".
  • Dan kemudian ". *" Dapat menampilkan sejumlah karakter apa pun atau tidak ada yang bisa berjalan.

Solusi terbaik

Setelah h muncul angka, dan spesifikasi html menyatakan bahwa angka dari 1 hingga 6 valid, dan tag itu sendiri tidak dapat ditutup oleh apa pun selain tanda kurung segitiga. Oleh karena itu, solusi ini akan lebih akurat:


<h [1-6] [^>] *>. +? <\ / h [1-6]>

Benar, ada kesalahan yang memungkinkan Anda untuk membuka tag dengan satu digit dan menutup yang lainnya. Dan karena itu, solusi yang bahkan lebih akurat adalah dengan menggunakan tautan: "<h ([1-6]) [^>] *>. +? <\ / H \ 1>". Ini bukan untuk mengatakan bahwa tes ini tidak peka terhadap huruf besar-kecil.


Solusi parsing
  • "h [1-6]" - di sini kita mengatakan bahwa setelah "h" angkanya harus dari 1 menjadi 6.
  • "[^>] *" - karakter apa pun kecuali ">" dapat terus berjalan, atau mereka tidak dapat pergi.

Secara terpisah, tentang penambahan:


  • Membungkus ekspresi "(h [1-6])" dalam tanda kurung kami membuat grup di nomor 1.
  • Selanjutnya, dengan menggunakan tautan ke grup pertama "\ 1" kita berbicara tentang apa yang ingin kita lihat di akhir yang sama, h dengan nomor yang sama seperti di awal.

Tugas 9 - Telepon


Dalam teks bebas ditemukan di semua ponsel dalam format berbeda.


Kesulitan: sulit.


Petunjuk

Adalah perlu untuk menggunakan tanda kehadiran simbol atau ketidakhadirannya, penghitung untuk membatasi jumlah digit, dan pembangunan set karakter. Kemungkinan desain atau.


Solusi
\ (? \ d {3} [\). \ / -] {1,2} \ d {3} [-.] \ D {4}

Ini akan berfungsi, tetapi memungkinkan dua karakter setelah tiga digit pertama - itu baik jika itu adalah tanda kurung tutup dan spasi setelahnya, tetapi buruk jika ada dua tanda hubung. Oleh karena itu, ada solusi yang sedikit lebih akurat: "\ (? \ D {3} (\)? | [. \ / -]) \ d {3} [-.] \ D {4}"


Solusi parsing
  • "\ (?" - kami mengindikasikan kemungkinan keberadaan simbol "(" atau tidak adanya, kami melindungi karena merupakan simbol yang dipesan.
  • "\ d {3}" - digit dengan batasan hanya 3.
  • Karakter selanjutnya "[\). \ / -] {1,2}" dimungkinkan - garis miring, tanda kurung tutup, titik, ruang, garis miring terbalik dan tanda hubung. {1,2} - mengatakan bahwa karakter-karakter ini bisa 1 atau 2. Misalnya, tanda kurung penutup dan spasi setelahnya.
  • Selanjutnya tentu "[-.]" - tanda hubung atau titik.
  • Dan "\ d {4}" adalah empat digit di akhir.

Tugas 10 - Penulis


Ada pola tertentu yang mengandung elemen, temukan semua penulis dari bidang penulis.


Kesulitan: sangat sulit.


Petunjuk

Perlu mengandalkan fakta bahwa semua nama penulis dimulai dengan huruf kapital dan ditulis dalam suatu pola.


Solusi
[AZ] [A-Za-z - '] +, [AZ] (\ {\\ "\ w \})? [A-za-z -'] * ([AZ] [A-Za-z- '] *)?

Solusi ini benar, tetapi memiliki minus. Kami berjalan di sekitar "{\" u} dengan "tongkat" ({\ "\ w})?" dan pada dasarnya itu bisa dilakukan jika Anda juga meletakkan kruk ini di bagian lain dari nama penulis.


Bagaimanapun, jika Anda bisa menyelesaikan masalah ini, ini sangat keren!


Solusi parsing
  • "[AZ] [A-Za-z - '] +" - Kami sedang mencari kata yang harus diawali dengan huruf kapital, kemudian berisi karakter alfabet, tanda hubung atau apostrof.
  • Lebih lanjut, semuanya persis sama dengan sedikit lebih tinggi, tetapi di sini kita memiliki "({\" \ w})? "- itu hanya penopang yang memungkinkan Anda untuk memotong perisai. Ini berarti bahwa sepotong" {\ "u}" dapat hadir atau untuk absen.
  • Dan sekali lagi, hal yang persis sama seperti dalam kasus pertama "([AZ] [A-Za-z - '] *)?", Pemberitahuan tersebut dengan pengecualian bahwa ungkapan ini dibungkus dalam grup dan ada "?" artinya tidak mengikat kondisi ini.

Pencacahan PS [A-Za-z] di sini adalah ukuran yang perlu, karena tidak ada pengubah dalam tes.


Solusi terbaik

Ada solusi yang lebih ringkas dan sederhana yang memungkinkan Anda untuk meninggalkan kruk di atas:


[AZ] \ S +, [AZ] \ S * ([AZ] [\ S] *)? \ B

Solusi parsing
  • "[AZ] \ S +," - pertama, tentu saja, huruf kapital "[AZ]", lalu sejumlah karakter non-spasi putih "\ S +" ke titik koma ",".
  • Lebih lanjut, hampir sama "[AZ] \ S *" - awal harus dengan huruf kapital, dan kemudian karakter non-spasi putih ke perbatasan kata "\ b".
  • "([AZ] [\ S] *)?" - dan di antara mereka kelompok yang sama, tetapi tidak wajib untuk nama tengah.

Tugas 11 - Konten Tajuk


Sama seperti dalam tugas 8, tetapi Anda tidak perlu menemukan tajuk itu sendiri, tetapi isinya.


Kesulitan: sulit.


Petunjuk

Tugas identik dengan tugas 8. Tidak sulit jika Anda tahu tentang bolak-balik. Memiliki solusi dengan melihat ke belakang dan tanpa melihat ke belakang.


Solusi

Tanpa melihat ke belakang:


([\ w] * <[^ h]. + | [^ ^>] +) (? = <\ / h \ d>)

Solusi parsing
  • "([\ w] * <[^ h]. + | [^ <>] +)" - ada dua opsi untuk bagaimana konten header dapat dimulai. Yang pertama adalah dengan tag di dalam "[\ ​​w] * <[^ h]. +" - pada saat yang sama Anda perlu memastikan bahwa itu bukan tag h dan memperhitungkan bahwa mungkin ada teks sebelum tag. Opsi kedua adalah teks tanpa tag "[^ <>] +", yaitu karakter apa saja selain membuka dan menutup tag.
  • "(? = <\ / h \ d>)" - melihat ke depan, di dalamnya harus ada tag penutup h.

Melihat ke belakang:


(? <= <h [^>] +>). +? (? = <\ / h \ d>)

Plus, Anda dapat memperhitungkan semua komentar pada solusi 8 dari masalah.


Solusi parsing
  • "(? <= <h [^>] +>)" "- mengintip ke belakang yang seharusnya berupa tag h.
  • "(? = <\ / h \ d>)" - melihat ke depan, di dalamnya harus ada tag penutup h.

Tugas 12 - Daftar Penulis


Tugasnya mirip dengan tugas ke-10, tetapi menurut saya lebih mudah.


Kesulitan: sulit.


Petunjuk

Semua prinsip dasar dari 10 tugas, tetapi Anda harus mempertimbangkan awal garis. Solusi yang saya tahu menggunakan mengintip kembali.


Solusi
(? <= ^ \ d + \.) [AZ] [\ w] +, [AZ] [\ w \.] +

Solusi parsing
  • "(? <= ^ \ d +.)" - melihat ke belakang di mana Anda harus memiliki sejumlah digit ke titik dengan spasi dari baris baru.
  • "[AZ] [\ w] +," - lebih jauh kata apa saja dari huruf besar ke titik koma dan sekali lagi sama "[AZ] [\ w.] +".

Atau sederhananya, ini:


(? <= ^ \ d + \.) [^,] +, [^,:] +

Solusi parsing
  • "(? <= ^ \ d +.)" - melihat ke belakang di mana Anda harus memiliki sejumlah digit ke titik dengan spasi dari baris baru.
  • "[^,] +," - sejumlah karakter apa pun ke koma + koma.
  • "[^,:] +" - sejumlah karakter apa pun sebelum koma atau titik dua.

Source: https://habr.com/ru/post/id472110/


All Articles