Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `re.sub(r\'(foo)\', r\'\\1123\', \'foobar\')` tidak menghasilkan \"foo123bar\" dalam ungkapan biasa Python?

Mengapakah `re.sub(r\'(foo)\', r\'\\1123\', \'foobar\')` tidak menghasilkan \"foo123bar\" dalam ungkapan biasa Python?

DDD
DDDasal
2024-11-03 22:19:30725semak imbas

Why does `re.sub(r'(foo)', r'23', 'foobar')` not produce

Kekeliruan Ungkapan Biasa Python: Penggantian dengan Rujukan Balik Bernombor Kumpulan

Apabila cuba menggantikan "foobar" dengan "foo123bar" menggunakan ungkapan biasa, anda mungkin menghadapi keputusan yang tidak dijangka. Penggantian seperti re.sub(r'(foo)', r'1123', 'foobar') gagal menghasilkan output yang diingini dan sebaliknya mengembalikan "J3bar."

Untuk memahami isu ini, adalah penting untuk perhatikan perbezaan antara rujukan belakang nombor kumpulan dan digit tersurat. Dalam kes ini, 1123 menganggap "1123" sebagai rentetan literal, bukan sebagai rujukan kepada kumpulan tangkapan pertama. Akibatnya, penggantian tidak berfungsi seperti yang dimaksudkan.

Untuk mencapai penggantian yang betul, anda harus menggunakan sintaks g, dengan "nombor" merujuk kepada nombor kumpulan. Contohnya:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

Dalam kes ini, g<1> menangkap subrentetan yang dipadankan oleh kumpulan pertama, iaitu rentetan "foo" daripada input. Dengan menggunakan rujukan belakang nombor kumpulan yang sesuai, penggantian dilakukan dengan betul, menghasilkan output "foo123bar."

Tingkah laku ini dijelaskan dalam dokumentasi Python, yang menerangkan penggunaan g untuk menentukan kumpulan bernama. Untuk nombor kumpulan, g boleh digunakan untuk merujuk kumpulan yang sepadan tanpa kesamaran, mengelakkan kemungkinan kekeliruan yang disebabkan oleh digit literal.

Atas ialah kandungan terperinci Mengapakah `re.sub(r\'(foo)\', r\'\\1123\', \'foobar\')` tidak menghasilkan \"foo123bar\" dalam ungkapan biasa Python?. 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