Pertanyaan Apa yang menyebabkan '' dalam ['h', 'e', ​​'l', 'l', 'o', ''] ketika Anda melakukan re.findall ('[\ w]?', 'Hello')


Apa yang menyebabkan '' di ['h', 'e', 'l', 'l', 'o', ''] saat kamu melakukan re.findall('[\w]?', 'hello'). Saya pikir hasilnya akan seperti itu ['h', 'e', 'l', 'l', 'o'], tanpa string kosong terakhir.


25
2018-01-18 17:33


asal


Jawaban:


Tanda tanya di regex Anda ('[\w]?') bertanggung jawab untuk string kosong yang menjadi salah satu hasil yang dikembalikan.

Tanda tanya adalah makna pengukur "zero-or-one matches." Anda meminta semua kemunculan dari "karakter kata" nol atau satu. Huruf-huruf memenuhi "-atau satu karakter" cocok. String kosong memenuhi kondisi kecocokan "karakter kata nol".

Ubah regex Anda menjadi '\w' (hapus tanda tanya dan kurung kelas karakter yang berlebihan) dan hasilnya akan seperti yang Anda harapkan.


40
2018-01-18 17:36



Lakukan pencarian ulang melalui string satu karakter dalam satu waktu. Jika kecocokan ditemukan pada posisi karakter, regex maju ke bagian selanjutnya dari pola. Jika kecocokan tidak ditemukan, regex akan mencoba pergantian (variasi berbeda) jika tersedia. Jika semua alternatif gagal, backtracks dan mencoba berganti-ganti bagian sebelumnya dan seterusnya sampai seluruh kecocokan ditemukan atau semua alternatif gagal. Inilah sebabnya mengapa beberapa regexes yang tampaknya sederhana akan cocok dengan string dengan cepat, tetapi gagal untuk mencocokkan dalam waktu eksponensial. Dalam contoh Anda, Anda hanya memiliki satu bagian dari pola Anda.

Anda sedang mencari [\w]?. Itu ? berarti "satu atau nol bagian sebelumnya "dan setara dengan {0,1}. Setiap 'h', 'e', 'l', 'l' & 'o' cocok [\w]{1}, sehingga polanya maju dan selesai untuk setiap huruf, memulai ulang regex di awal karena Anda meminta semua pertandingan, bukan hanya yang pertama. Di ujung string, regex masih mencoba mencari kecocokan. [\w]{1} tidak lagi cocok tapi alternatifnya [\w]{0} tidak, jadi itu cocok ''. Mesin regex modern memiliki aturan untuk menghentikan kecocokan nol-panjang dari pengulangan pada posisi yang sama. Regex mencoba lagi, tetapi kali ini gagal karena tidak dapat menemukan kecocokan [\w]{1} dan sudah menemukan kecocokan [\w]{0}. Ia tidak bisa maju melalui string karena itu pada akhirnya, sehingga ia keluar. Ini telah menjalankan pola 7 kali dan menemukan 6 pertandingan, yang terakhir kosong.

Seperti yang ditunjukkan dalam komentar, jika regex Anda adalah \w?? (Saya sudah dihapus [ dan ] karena mereka tidak diperlukan dalam regex asli Anda, artinya menemukan nol atau satu (perhatikan urutan telah berubah dari sebelumnya). Itu akan kembali '', 'h', '', 'e', '', 'l', '', 'l', '', 'o' & ''. Ini karena sekarang lebih suka mencari nol tetapi tidak dapat menemukan dua pertandingan sepanjang-nol berturut-turut tanpa maju.


5
2018-01-19 01:29