การจัดการการอ้างอิงย้อนกลับไปยังการจับกลุ่มในรูปแบบการแทนที่ re.sub


88

ฉันต้องการรับสตริง0.71331, 52.25378และส่งคืน0.71331,52.25378- นั่นคือเพียงแค่มองหาตัวเลขลูกน้ำช่องว่างและตัวเลขแล้วตัดช่องว่างออก

นี่คือรหัสปัจจุบันของฉัน:

coords = '0.71331, 52.25378'
coord_re = re.sub("(\d), (\d)", "\1,\2", coords)
print coord_re

0.7133,2.25378แต่ตอนนี้ให้ฉัน ผมทำอะไรผิดหรือเปล่า?


4
เนื่องจากคุณไม่จริงต้องการที่จะจับตัวเลขก็อาจทำให้รู้สึกมากขึ้นกับการใช้รูปลักษณ์ arounds re.sub(r'(?<=\d), (?=\d)', ',', coords)คือ:
ig0774

1
คำถามนี้ไม่จำเป็นต้องใช้ regex ให้ใช้การแทนที่: coords.replace(' ', '')
Gringo Suave

คำตอบ:


120

คุณควรใช้สตริงดิบสำหรับ regex ลองทำดังต่อไปนี้:

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

ด้วยรหัสปัจจุบันของคุณแบ็กสแลชในสตริงแทนที่ของคุณกำลังหลีกเลี่ยงตัวเลขดังนั้นคุณจึงแทนที่การจับคู่ทั้งหมดที่เทียบเท่ากับchr(1) + "," + chr(2):

>>> '\1,\2'
'\x01,\x02'
>>> print '\1,\2'
,
>>> print r'\1,\2'   # this is what you actually want
\1,\2

เมื่อใดก็ตามที่คุณต้องการเว้นแบ็กสแลชไว้ในสตริงให้ใช้rคำนำหน้าหรือหลีกเลี่ยงเครื่องหมายทับขวา ( \\1,\\2)


2
ขอบคุณที่ทำเคล็ดลับ docs.python.org/library/re.html#raw-string-notationสำหรับทุกคนที่อ่านข้อความนี้
Richard

1
นอกจากนี้ยังstackoverflow.com/questions/2081640/...สำหรับคำอธิบายที่ดีของสิ่งสตริงดิบ
Richard

คุณจะพิมพ์ชื่อกลุ่มในตัวอย่างด้านบนอย่างไร สมมติว่าถ้ากลุ่ม\1ที่เรียกว่าxCoordเป็นไปได้ไหมที่จะสั่งre.subให้แทนที่สตริงย่อยด้วยชื่อกลุ่มซึ่งre.sub(r"(\d), (\d)", r"\1,\2", coords)ส่งผลให้สตริงตามตัวอักษรxCoord,52.25378
zelusp

สิ่งนี้ใช้ไม่ได้ใน Python3 การใช้\1แทนที่ด้วยอักขระ Unicode ที่แปลกประหลาด
Cerin

16

งูหลามตีความ\1เป็นตัวละครที่มีค่า ASCII 1, subและผ่านที่

ใช้สตริงดิบซึ่ง Python ไม่ตีความไฟล์\.

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

สิ่งนี้อยู่ในส่วนเริ่มต้นของreเอกสารหากคุณต้องการข้อมูลเพิ่มเติม

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