...'
,"..."
Python-д хэрэв та эдгээр стринг литералуудыг дараах тэмдэгтүүдийн аль нэгээр нь угтвал утга нь escape дарааллыг тэлэхгүйгээр мөр болж хувирна.
r
R
Windows-ийн замууд болон тогтмол илэрхийллийн хэв маяг гэх мэт олон тооны урвуу зураасыг ашигладаг мөрүүдтэй ажиллахад хэрэгтэй.
Энд дараах мэдээллийг хүргэж байна.
- зугтах дараалал
- Түүхий тэмдэгт мөрүүд дэх зугтах дарааллыг үл тоомсорлох (идэвхгүй).
- Ердийн мөрийг түүхий мөр болгон хөрвүүлэх:
repr()
- Төгсгөлд нь урвуу зураасыг тэмдэглэ.
зугтах дараалал
Python-д ердийн мөрөнд дүрслэх боломжгүй тэмдэгтүүдийг (таб, шинэ мөр гэх мэт) Си хэлтэй адил урвуу зураастай escape дарааллаар дүрсэлсэн байдаг. Зугтах дарааллын жишээг доор үзүүлэв.
\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
Түүхий мөрийн төрөл гэж нэрлэгддэг тусгай төрөл байдаггүй бөгөөд энэ нь зүгээр л мөрийн төрөл бөгөөд дараах байдлаар илэрхийлэгдсэн урвуу зураастай ердийн мөртэй тэнцүү байна.\\
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