สตริง Python แทนที่อักขระด้วย regex [ซ้ำกัน]

Nov 27 2020

ฉันพบปัญหา regex ที่ฉันไม่เข้าใจ ฉันกำลังพยายามแทนที่เครื่องหมายจุลภาคระหว่างสตริงด้วยเครื่องหมายอัฒภาคและไม่ได้ผล นี่คือสตริงตัวอย่างด้านล่าง ฉันตั้งค่านิพจน์ทั่วไปเพื่อแทนที่ทุกอย่างยกเว้นเนื้อหาหลังจาก "ลำดับ" ในกลุ่มที่ไม่จับภาพ regex ดังนั้นควรแทนที่เครื่องหมายจุลภาคที่ส่วนท้ายด้วยสตริงย่อยเดียวในกลุ่มที่ไม่จับภาพคือเซมิโคลอน แต่มันไม่ได้ผล ดูเหมือนว่าจะเก็บสตริงใด ๆ ไว้เมื่อฉันใส่ (?: sequences :) เป็นกลุ่มที่ไม่จับภาพ ทันทีที่ฉันเพิ่ม \ d มันจะแทนที่ทั้งสิ่ง ฉันไม่แน่ใจว่าทำไม

ในปัญหาที่แท้จริงของฉันฉันมีแท็กเนื้อหาที่ร้ายแรงซึ่งทำเครื่องหมายด้วยเครื่องหมายจุดคู่และลงท้ายด้วยอัฒภาค ในลำดับแท็กมีเครื่องหมายจุลภาคที่ไม่ถูกต้องแทนที่จะเป็นเครื่องหมายอัฒภาคซึ่งฉันต้องการแทนที่ แต่ปล่อยให้ทุกอย่างไม่เปลี่ยนแปลง ดังนั้นวิธีแก้ปัญหาควรเปลี่ยนลำดับ: 2 เป็นลำดับ: 2;

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?:sequence\:)(?:\d)(\,)", ";", a_string)

new_string

ฉันดูวิธีแก้ปัญหาอื่น ๆที่ควรใช้ แต่ไม่ทำเช่นนี้ ขอความช่วยเหลือใด ๆ และโปรดแจ้งให้เราทราบหากสามารถทำให้คำถามนี้ชัดเจนขึ้นได้อีก

คำตอบ

1 TimBiegeleisen Nov 27 2020 at 06:17

คุณอาจตั้งใจที่จะใช้รูปลักษณ์เชิงลบเชิงบวกเบื้องหลังที่นี่

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(?<=\bsequence:\d)(\,)", ";", a_string)

print(new_string)

สิ่งนี้พิมพ์:

tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2; tag4: content4

อย่างไรก็ตามหากคุณต้องการจับคู่sequenceข้อความก่อนเครื่องหมายจุลภาคเป้าหมายโดยตรงก็ไม่เป็นไร แต่ให้แทนที่ด้วยโดยใช้กลุ่มการจับภาพ:

a_string = "tag1: content1 is this tag2: 0.1 amount; tag3: july 2020; sequence:2, tag4: content4"
new_string = re.sub(r"(sequence:\d)(\,)", "\\1;", a_string)
print(new_string)   # same as above