Python Regex แทนที่กลุ่มทันที


108

มีวิธีใดในการแทนที่กลุ่มทั้งหมดโดยตรงโดยใช้ไวยากรณ์ regex

วิธีปกติ:

re.match(r"(?:aaa)(_bbb)", string1).group(1)

แต่ฉันต้องการบรรลุสิ่งนี้:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

ฉันต้องการสร้างสตริงใหม่ทันทีจากกลุ่มที่ Regex เพิ่งจับมา

คำตอบ:


191

ดูได้ที่re.sub:

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

นี่คือฟังก์ชันการแทนที่ regex (แทนที่) ของ Python สตริงแทนที่สามารถเติมสิ่งที่เรียกว่า backreferences (แบ็กสแลชหมายเลขกลุ่ม) ซึ่งแทนที่ด้วยสิ่งที่จับคู่โดยกลุ่ม กลุ่มจะถูกนับเช่นเดียวกับgroup(...)ฟังก์ชันกล่าวคือเริ่ม1จากซ้ายไปขวาโดยการเปิดวงเล็บ


4
ชัดเจนยิ่งกว่าเอกสาร! ไม่เข้าใจว่ากลุ่มทำงานกับอันนี้อย่างไร พวกเขาควรเพิ่มตัวอย่างดังกล่าว
Y0da

มันใช้งานได้ตั้งแต่ครั้งแรกนี่เป็นวิธีที่ค่อนข้างชัดเจนในการอธิบาย ขอบคุณและคุณช่วยอธิบายได้ไหมว่ากลุ่มย่อยควรเรียกใช้ใน(r(r))r((r)((r)r))สถานการณ์ที่เหมาะสมอย่างไร
Rakshitha Muranga Rodrigo

1
@RakshithaMurangaRodrigo กลุ่มต่างๆจะเรียงลำดับจากซ้ายไปขวาตามจุดเริ่มต้น 1(r2(r))r3(4(r)5(6(r)r))ดังนั้นถ้าฉันใส่ของแต่ละกลุ่มมีจำนวนที่เหมาะสมในด้านหน้าของกลุ่มที่พวกเขาต้องการจะเรียง:
Martin Ender

30

คำตอบที่ได้รับการยอมรับนั้นสมบูรณ์แบบ ฉันจะเพิ่มการอ้างอิงกลุ่มนั้นน่าจะทำได้ดีกว่าโดยใช้ไวยากรณ์นี้:

r"\g<1> \g<2>"

สำหรับสตริงทดแทน ด้วยวิธีนี้คุณจะหลีกเลี่ยงข้อ จำกัด ทางไวยากรณ์ที่กลุ่มอาจตามด้วยตัวเลข อีกครั้งนี่คือทั้งหมดที่มีอยู่ในเอกสารไม่มีอะไรใหม่บางครั้งก็ยากที่จะมองเห็นตั้งแต่แรกเห็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.