Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa `re.findall` Tidak Mengembalikan Padanan Regex Bertindih, dan Bagaimanakah Penegasan Pandangan Ke Hadapan Boleh Menyelesaikan Ini?

Mengapa `re.findall` Tidak Mengembalikan Padanan Regex Bertindih, dan Bagaimanakah Penegasan Pandangan Ke Hadapan Boleh Menyelesaikan Ini?

Barbara Streisand
Lepaskan: 2024-12-06 07:54:11
asal
889 orang telah melayarinya

Why Doesn't `re.findall` Return Overlapping Regex Matches, and How Can Lookahead Assertions Solve This?

Mendedahkan Padanan Regex Bertindih: Selami Penegasan Pandangan Ke Hadapan

Masalah:
Apabila menggunakan re.findall untuk memadankan corak ungkapan biasa, mengapa ia tidak mendapatkan semula semua perlawanan bertindih? Sebagai contoh, dalam rentetan "hello," mengapakah regex r'ww' hanya sepadan dengan "dia" dan "ll" tetapi bukan "el" dan "lo"?

Jawapan:
Secara lalai, re.findall tidak menghasilkan padanan bertindih. Untuk mencapai matlamat ini, gunakan penegasan pandang ke hadapan, ciri regex yang berkuasa.

Penyelesaian:

# Using a lookahead assertion
matches = re.findall(r'(?=(\w\w))', 'hello')

# Output: ['he', 'el', 'll', 'lo']
Salin selepas log masuk

Konstruk (?=...) dalam regex ialah dakwaan memandang ke hadapan. Ia sepadan jika corak yang ditentukan muncul serta-merta selepas kedudukan semasa, tetapi ia tidak menggunakan sebarang aksara daripada rentetan. Dalam kes ini, ia mengenal pasti semua jujukan dua aksara ("ww") dalam "hello" tanpa menggunakan sebarang aksara.

Penjelasan:

  • Kurungan ungkapan (ww) mentakrifkan corak dua aksara untuk dipadankan.
  • (?=) mendahului corak, menunjukkan penegasan memandang ke hadapan.
  • Ungkapan biasa引擎 menggerakkan kursor sepanjang "hello" dan secara berterusan menyemak sama ada dua aksara seterusnya sepadan dengan corak "ww."
  • Jika mereka melakukannya , ia merekodkan kedudukan semasa sebagai padanan.
  • Proses ini berterusan, mengakibatkan pengesanan semua pertindihan padanan: "dia," "el," "ll," dan "lo."

Atas ialah kandungan terperinci Mengapa `re.findall` Tidak Mengembalikan Padanan Regex Bertindih, dan Bagaimanakah Penegasan Pandangan Ke Hadapan Boleh Menyelesaikan Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan