Игнорирование (отключение) управляющих последовательностей в Python при работе с необработанными строками

Бизнес

'...', "..."В Python, если вы снабдите эти строковые литералы одним из следующих символов, значение станет строкой без расширения управляющей последовательности.

  • r
  • R

Полезно при работе со строками, в которых используется большое количество обратных слешей, например, пути Windows и шаблоны регулярных выражений.
Здесь представлена следующая информация.

  • последовательность действий
  • Игнорировать (отключить) управляющие последовательности в необработанных строках
  • Преобразование обычной строки в необработанную строку:repr()
  • Обратите внимание на обратную косую черту в конце.

последовательность действий

В Python символы, которые не могут быть представлены в обычной строке (такие как табуляция и новая строка), описываются с помощью управляющих последовательностей с обратными косыми чертами, аналогично языку Си. Пример управляющей последовательности показан ниже.

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

Игнорировать (отключить) управляющие последовательности в необработанных строках

'...', "..."Если вы добавите к такому строковому литералу один из следующих префиксов, значение станет строкой без расширения экранирующей последовательности. Такая строка называется необработанной строкой.

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

Не существует специального типа, называемого типом raw 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
Copied title and URL