python re.sub group: number หลัง \ number


183

ฉันจะแทนที่foobarด้วยได้foo123barอย่างไร

สิ่งนี้ใช้ไม่ได้:

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

งานนี้:

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

\numberฉันคิดว่ามันเป็นปัญหาที่พบบ่อยเมื่อมีบางสิ่งบางอย่างเช่น ทุกคนสามารถให้คำแนะนำเกี่ยวกับวิธีการจัดการกับฉันได้หรือไม่


2
คำถามนี้ถูกเพิ่มไปยังคำถามที่พบบ่อยของนิพจน์สแต็คล้นปกติภายใต้ "กลุ่ม"
aliteralmind

1
คำถามนี้ใช้เวลานานพอสมควรในการค้นหาเพราะมันไม่ได้มีคุณสมบัติ 'กลุ่มจับภาพ' หรือ 'กลุ่มอ้างอิงหมายเลข' แต่ในที่สุดฉันก็มาถึงและดีใจที่คุณถาม
Mark Ch

1
ปัญหาของคุณคือ r '\ 112' กำลังถูกตีความว่าเป็นเลขฐานแปด 0112, ASCII'J 'หรือทศนิยม 74 ไม่เห็นวิธีการบังคับ backreference' \ 1 'เพื่อรับการประเมินก่อนการต่อสตริงหรือ''.join()
smci

ค่าเบี่ยงเบนเล็กน้อยจากคำถามมีวิธีใดบ้างในการอ้างอิงการแข่งขันกลุ่มทั้งหมดเช่น r '\ <สำหรับการแข่งขันทั้งหมด> hi'?
Sayan Dey

คำตอบ:


313

คำตอบคือ:

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

ข้อความที่ตัดตอนมาที่เกี่ยวข้องจากเอกสาร:

นอกเหนือจากการยกเว้นอักขระและการอ้างอิงย้อนกลับตามที่อธิบายไว้ข้างต้นแล้ว \ g จะใช้สตริงย่อยที่จับคู่โดยกลุ่มชื่อชื่อตามที่กำหนดโดยไวยากรณ์ (? P ... ) \ g ใช้หมายเลขกลุ่มที่สอดคล้องกัน; \ g <2> จึงเทียบเท่ากับ \ 2 แต่ไม่ชัดเจนในการแทนที่เช่น \ g <2> 0 \ 20 จะถูกตีความเป็นการอ้างอิงถึงกลุ่ม 20 ไม่ใช่การอ้างอิงถึงกลุ่ม 2 ตามด้วยตัวอักษร '0' backreference \ g <0> ทดแทนในสตริงย่อยทั้งหมดที่ตรงกับ RE


48
อย่าหนักหนาสาหัสกับตัวเอง มันถูกฝังอยู่ในเอกสารจนทำให้ผู้คนส่วนใหญ่ใช้เวลาในการอ่านเอกสารมากกว่า google คำถามของพวกเขาและให้คำตอบนี้เกิดขึ้นดังนั้น
เครื่องบินความเร็ว

1
ใบเสนอราคาที่แน่นอนให้ไว้ที่นี่ในกรณีที่คุณกำลังมองหาบริบท
patrick

ฉันสามารถพากลุ่มและแก้ไขได้ไหม \ g <1> ... ตัวอย่างเช่นในกรณีนี้ g <1> คือ foo แต่ฉันต้องการเปลี่ยน o โดย u เช่น "fuu"
Eric
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.