การหนีอักขระพิเศษในเรกเอ็กซ์ของ Python
สมมติว่าคุณต้องการให้สัญลักษณ์พิเศษหมายถึงตัวของมันเอง ในการทำเช่นนั้น คุณควรหนีมันโดยใช้แบ็กสแลช ลองดูตัวอย่าง
ตัวอย่าง
ในตัวอย่างต่อไปนี้ ผู้เขียนเรกเอ็กซ์ต้องการให้รูปแบบการค้นหาดูเหมือนว่า: ตัวอักษร
'a' ตามด้วยเครื่องหมายบวก '+' ตามด้วยตัวอักษร 'x' อย่างไรก็ตาม ผู้เขียนโค้ด
ไม่ได้หนีอักขระ '+' ดังนั้นรูปแบบการค้นหาในความเป็นจริงจึงมีลักษณะดังนี้:
ตัวอักษร 'a' หนึ่งครั้งหรือมากกว่า จากนั้นตัวอักษร 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
ผลลัพธ์ของการรันโค้ด:
'a+x ! ! !'
ตัวอย่าง
และตอนนี้ผู้เขียนได้หนีเครื่องหมายบวกด้วยแบ็กสแลชแล้ว ตอนนี้รูปแบบการค้นหาดูเหมือนอย่างที่ควรแล้ว: ตัวอักษร 'a' ตามด้วยเครื่องหมายบวก
'+' ตามด้วยตัวอักษร 'x':
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
ผลลัพธ์ของการรันโค้ด:
'! ax aax aaax'
ตัวอย่าง
ในตัวอย่างนี้ รูปแบบมีลักษณะดังนี้:
ตัวอักษร 'a' ตามด้วยจุด '.'
ตามด้วยตัวอักษร 'x':
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
ผลลัพธ์ของการรันโค้ด:
'! abx azx'
ตัวอย่าง
ในตัวอย่างต่อไปนี้ ผู้เขียนลืมหนีจุด และสตริงย่อยทั้งหมดตรงกับเรกเอ็กซ์ เนื่องจากจุดที่ไม่ถูกหนีหมายถึง อักขระใดๆ:
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
ผลลัพธ์ของการรันโค้ด:
'! ! !'
หมายเหตุ
สังเกตว่าถ้าคุณลืมแบ็กสแลชสำหรับจุด (เมื่อ มันควรจะหมายถึงตัวมันเอง) - คุณอาจจะสังเกตไม่เห็น:
res = re.sub('a.x', '!', 'a.x')
print(res) # คืนค่า '!' อย่างที่เราต้องการ
จากที่เห็นทำงานได้ถูกต้อง (เนื่องจากจุด
หมายถึงอักขระใดๆ รวมถึง
จุดธรรมดา '.' ด้วย) แต่ถ้าเปลี่ยน
สตริงที่ถูกแทนที่ - เราจะเห็นข้อผิดพลาดของเรา:
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # คืนค่า '! ! !' แต่คาดหวัง '! abx azx'
รายการอักขระพิเศษและอักขระธรรมดา
หากหนีอักขระธรรมดา - จะไม่มีอะไร แย่เกิดขึ้น - มันจะยังคงหมายถึงตัวของมันเอง ข้อยกเว้นคือตัวเลข ไม่สามารถหนีพวกมันได้
บ่อยครั้งที่เกิดความสงสัยว่าอักขระนี้ เป็นอักขระพิเศษหรือไม่ บางคนถึงกับ หนีอักขระที่น่าสงสัยทั้งหมด อย่างไรก็ตาม นี่เป็นวิธีปฏิบัติที่ไม่ดี (ทำให้เรกเอ็กซ์รกไปด้วยแบ็กสแลช)
เป็นอักขระพิเศษ: $ ^ . * + ? \ / {} [] () |
ไม่ใช่อักขระพิเศษ: @ : , ' " - _ = < > % # ~ `& !
โจทย์ฝึกปฏิบัติ
กำหนดสตริง:
txt = 'a.a aba aea'
เขียนเรกเอ็กซ์ที่ค้นหาสตริง
'a.a' โดยไม่จับส่วนอื่น
กำหนดสตริง:
txt = '2+3 223 2223'
เขียนเรกเอ็กซ์ที่ค้นหาสตริง
'2+3' โดยไม่จับส่วนอื่น
กำหนดสตริง:
txt = '23 2+3 2++3 2+++3 345 567'
เขียนเรกเอ็กซ์ที่ค้นหาสตริง
'2+3', '2++3', '2+++3'
โดยไม่จับส่วนอื่น (+ อาจมีจำนวนเท่าใดก็ได้)
กำหนดสตริง:
txt = '23 2+3 2++3 2+++3 445 677'
เขียนเรกเอ็กซ์ที่ค้นหาสตริง
'23', '2+3', '2++3',
'2+++3' โดยไม่จับส่วนอื่น
กำหนดสตริง:
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
เขียนเรกเอ็กซ์ที่ค้นหาสตริง
'*q+', '*qq+', '*qqq+'
โดยไม่จับส่วนอื่น
กำหนดสตริง:
txt = '[abc] {abc} abc (abc) [abc]'
เขียนเรกเอ็กซ์ที่ค้นหาสตริง
ที่อยู่ในวงเล็บเหลี่ยมและแทนที่ด้วย
'!'