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
Barbara Streisandasal
2024-12-06 07:54:11936semak imbas

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']

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!

Kenyataan:
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