...'
,"..."
У Python, якщо до цих рядкових літералів додати один із наступних символів, значення стане рядком без розширення escape-послідовності.
r
R
Корисно під час роботи з рядками, які використовують багато зворотних слешів, наприклад, шляхи Windows і шаблони регулярних виразів.
Тут наведено наступну інформацію.
- вихідна послідовність
- Ігнорувати (вимкнути) escape-послідовності в необроблених рядках
- Перетворіть звичайний рядок у необроблений рядок:
repr()
- Зверніть увагу на зворотну косу риску в кінці.
вихідна послідовність
У Python символи, які не можуть бути представлені в звичайному рядку (наприклад, табуляція та новий рядок), описуються за допомогою escape-послідовностей із зворотною косою рискою, подібно до мови C. Приклад escape-послідовності показано нижче.
\t
\n
s = 'a\tb\nA\tB'
print(s)
# a b
# A B
Ігнорувати (вимкнути) escape-послідовності в необроблених рядках
...'
,"..."
Якщо до такого рядкового літералу додати одне з наступних, значення стане рядком без розширення 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
У звичайному рядку escape-послідовність вважається одним символом, але в необробленому рядку зворотна коса риски також враховуються як символи. Довжина рядка та кожного символу є наступною.
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()
Якщо ви хочете перетворити звичайний рядок у необроблений рядок, ігноруючи (вимкнувши) escape-послідовності, ви можете використовувати вбудовану функцію 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