python re.sub group: angka setelah \ angka

183

Bagaimana saya bisa mengganti foobardengan foo123bar?

Ini tidak berfungsi:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

Ini bekerja:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

Saya pikir itu masalah umum ketika memiliki sesuatu seperti \number. Adakah yang bisa memberi saya petunjuk tentang cara menangani ini?

zhigang
sumber
2
Pertanyaan ini telah ditambahkan ke FAQ Ekspresi Reguler Overflow Overflow , di bawah "Grup".
aliteralmind
1
pertanyaan ini memakan waktu cukup lama untuk saya temukan, karena tidak menampilkan istilah 'grup tangkap' atau 'referensi grup bernomor', tetapi saya akhirnya datang dan senang Anda menanyakannya.
Mark Ch
1
Masalah Anda adalah bahwa r '\ 112' ditafsirkan sebagai oktal literal 0112, ASCII'J ', atau desimal 74. Tidak dapat melihat bagaimana memaksa backreference' \ 1 'untuk dievaluasi sebelum penggabungan string atau''.join()
smci
penyimpangan kecil dari pertanyaan, cara apa pun untuk merujuk semua pertandingan grup yaitu r '\ <untuk semua pertandingan> hai?
Sayan Dey

Jawaban:

313

Jawabannya adalah:

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

Kutipan yang relevan dari dokumen:

Selain pelarian karakter dan referensi-ulang seperti dijelaskan di atas, \ g akan menggunakan substring yang cocok dengan nama grup, seperti yang didefinisikan oleh sintaks (? P ...). \ g menggunakan nomor grup yang sesuai; Karena itu \ g <2> setara dengan \ 2, tetapi tidak ambigu dalam penggantian seperti \ g <2> 0. \ 20 akan ditafsirkan sebagai referensi ke grup 20, bukan referensi ke grup 2 diikuti oleh karakter literal '0'. Referensi balik \ g <0> menggantikan seluruh substring yang cocok dengan RE.

John Gaines Jr.
sumber
48
Jangan terlalu keras pada diri sendiri. Sudah terkubur dalam dokumentasi sejauh ini sehingga dibutuhkan waktu lebih banyak orang untuk membaca dokumen daripada mencari di Google pertanyaan mereka dan jawaban ini muncul di SO.
speedplane
1
Kutipan persis yang disediakan ditemukan di sini jika Anda mencari konteks
patrick
Bisakah saya mengambil grup dan memodifikasinya? \ g <1> ... Misalnya dalam kasus ini g <1> adalah foo, tapi aku ingin mengubah o olehmu, seperti "fuu" ini
Eric Bellet