ละเว้น (ปิดใช้งาน) ลำดับหลีกใน Python ด้วยสตริงดิบ

ธุรกิจ

...',"..."ใน Python หากคุณนำหน้าตัวอักษรสตริงเหล่านี้ด้วยอักขระตัวใดตัวหนึ่งต่อไปนี้ ค่าจะกลายเป็นสตริงโดยไม่ต้องขยายลำดับการหลบหนี

  • r
  • R

มีประโยชน์เมื่อต้องจัดการกับสตริงที่ใช้แบ็กสแลชจำนวนมาก เช่น เส้นทางของ Windows และรูปแบบนิพจน์ทั่วไป
ข้อมูลต่อไปนี้มีให้ที่นี่

  • ลำดับการหลบหนี
  • ละเว้น (ปิดใช้งาน) ลำดับหลีกในสตริงดิบ
  • แปลงสตริงปกติเป็นสตริงดิบ:repr()
  • สังเกตแบ็กสแลชในตอนท้าย

ลำดับการหลบหนี

ใน Python อักขระที่ไม่สามารถแสดงในสตริงปกติ (เช่น แท็บและการขึ้นบรรทัดใหม่) จะถูกอธิบายโดยใช้ Escape Sequence ที่มีแบ็กสแลช ซึ่งคล้ายกับภาษา C ตัวอย่างของลำดับการหลบหนีแสดงไว้ด้านล่าง

  • \t
  • \n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B

ละเว้น (ปิดใช้งาน) ลำดับหลีกในสตริงดิบ

...',"..."หากคุณนำหน้าตัวอักษรสตริงดังกล่าวด้วยค่าใดค่าหนึ่งต่อไปนี้ ค่าจะกลายเป็นสตริงโดยไม่ขยายลำดับ Escape สตริงดังกล่าวเรียกว่าสตริงดิบ

  • r
  • R
rs = r'a\tb\nA\tB'
print(rs)
# a\tb\nA\tB

ไม่มีชนิดพิเศษที่เรียกว่า raw string type เป็นเพียงชนิด string และมีค่าเท่ากับ string ปกติโดยมีเครื่องหมายแบ็กสแลชแสดงดังนี้
\\

print(type(rs))
# <class 'str'>

print(rs == 'a\\tb\\nA\\tB')
# True

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

print(len(s))
# 7

print(list(s))
# ['a', '\t', 'b', '\n', 'A', '\t', 'B']

print(len(rs))
# 10

print(list(rs))
# ['a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B']

เส้นทางของ Windows

การใช้สตริงดิบมีประโยชน์เมื่อคุณต้องการแสดงพาธของ Windows เป็นสตริง

เส้นทางของ Windows ถูกคั่นด้วยแบ็กสแลช ดังนั้น หากคุณใช้สตริงปกติ คุณต้องหลีกเลี่ยงพาธดังนี้ แต่ถ้าคุณใช้สตริงดิบ คุณสามารถเขียนได้ตามที่เป็นอยู่ มีค่าเท่ากัน
\\

path = 'C:\\Windows\\system32\\cmd.exe'
rpath = r'C:\Windows\system32\cmd.exe'
print(path == rpath)
# True

โปรดทราบว่าสตริงที่ลงท้ายด้วยแบ็กสแลชเป็นจำนวนคี่จะทำให้เกิดข้อผิดพลาด ดังที่อธิบายไว้ด้านล่าง ในกรณีนี้ จำเป็นต้องเขียนสตริงเป็นสตริงปกติ หรือต่อด้วยการเขียนเฉพาะส่วนท้ายของสตริงเป็นสตริงปกติ

path2 = 'C:\\Windows\\system32\\'
# rpath2 = r'C:\Windows\system32\'
# SyntaxError: EOL while scanning string literal
rpath2 = r'C:\Windows\system32' + '\\'
print(path2 == rpath2)
# True

แปลงสตริงปกติเป็นสตริงดิบด้วย repr()

หากคุณต้องการแปลงสตริงปกติเป็นสตริงดิบโดยไม่สนใจลำดับหลีก (ปิดใช้งาน) คุณสามารถใช้ฟังก์ชัน repr() ในตัว

s_r = repr(s)
print(s_r)
# 'a\tb\nA\tB'

สิ่งที่ repr() ส่งคืนคือสตริงที่แสดงถึงอ็อบเจ็กต์เพื่อให้มีค่าเดียวกับเมื่อส่งผ่านไปยัง eval() โดยมีอักขระนำหน้าและต่อท้าย

print(list(s_r))
# ["'", 'a', '\\', 't', 'b', '\\', 'n', 'A', '\\', 't', 'B', "'"]

การใช้สไลซ์ เราสามารถรับสตริงที่เทียบเท่ากับสตริงดิบโดยแนบ r

s_r2 = repr(s)[1:-1]
print(s_r2)
# a\tb\nA\tB

print(s_r2 == rs)
# True

print(r'\t' == repr('\t')[1:-1])
# True

สังเกตแบ็กสแลชในตอนท้าย

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

# print(r'\')
# SyntaxError: EOL while scanning string literal

print(r'\\')
# \\

# print(r'\\\')
# SyntaxError: EOL while scanning string literal