Penggantian Tidak Dijangka dengan re.sub dan Flag
Dokumentasi Python menyatakan bahawa bendera re.MULTILINE membenarkan aksara karet (^) untuk perlawanan pada permulaan setiap baris. Walau bagaimanapun, apabila menggunakan bendera ini dengan re.sub, tingkah laku yang tidak dijangka boleh berlaku.
Pertimbangkan contoh ini:
<code class="python">import re s = """// The quick brown fox. // Jumped over the lazy dog.""" result = re.sub('^//', '', s, re.MULTILINE) print(result)</code>
Hasil yang dijangkakan adalah untuk semua baris bermula dengan "//" menjadi digantikan dengan rentetan kosong, hanya tinggal:
The quick brown fox. Jumped over the lazy dog.
Walau bagaimanapun, keputusan sebenar ialah:
The quick brown fox. // Jumped over the lazy dog.
Sebab Isu
Isu timbul kerana fungsi re.sub menerima hujah keempat untuk bilangan maksimum penggantian yang perlu dibuat. Dalam contoh, re.MULTILINE telah tersilap digunakan sebagai kiraan dan bukannya sebagai bendera.
Penyelesaian
Untuk membetulkan tingkah laku ini, gunakan argumen bernama untuk menentukan bendera:
<code class="python">result = re.sub('^//', '', s, flags=re.MULTILINE)</code>
Sebagai alternatif, anda boleh menyusun ungkapan biasa dengan bendera yang diingini sebelum menggunakannya dengan re.sub:
<code class="python">regex = re.compile('^//', re.MULTILINE) result = re.sub(regex, '', s)</code>
Dengan menentukan bendera re.MULTILINE dengan betul, anda boleh memastikan bahawa semua kemunculan corak ^// diganti, tanpa mengira kedudukannya dalam rentetan.
Atas ialah kandungan terperinci Mengapa re.sub Berkelakuan Tidak Dijangka dengan Bendera re.MULTILINE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!