Почему я не могу завершить необработанную строку обратной косой чертой?
Я запутался здесь, хотя необработанные строки преобразуют каждый \
в \\
но когда это \
появляется в конце, это вызывает ошибку.
>>> r'so\m\e \te\xt'
'so\\m\\e \\te\\xt'
>>> r'so\m\e \te\xt\'
SyntaxError: EOL while scanning string literal
Обновить:
Это теперь также описано в FAQ по Python: почему необработанные строки (r-строки) не могут заканчиваться обратной косой чертой?
4 ответа
Тебе еще нужно \
Сбежать '
или же "
в необработанных строках, так как иначе интерпретатор python не знает, где останавливается строка. В вашем примере вы избегаете закрытия '
,
Иначе:
r'it wouldn\'t be possible to store this string'
r'since it'd produce a syntax error without the escape'
Посмотрите на подсветку синтаксиса, чтобы понять, что я имею в виду.
Необработанные строки не могут заканчиваться одинарной обратной косой чертой из-за того, как работает синтаксический анализатор (однако, фактического экранирования не происходит). Обходной путь - добавить обратную косую черту в виде необработанного строкового литерала после этого:
>>> print(r'foo\')
File "<stdin>", line 1
print(r'foo\')
^
SyntaxError: EOL while scanning string literal
>>> print(r'foo''\\')
foo\
Не красиво, но это работает. Вы можете добавить плюс, чтобы прояснить происходящее, но это не обязательно:
>>> print(r'foo' + '\\')
foo\
Строки Python обрабатываются в два этапа:
Сначала токенизатор ищет закрывающую цитату. Он распознает обратную косую черту, когда это делает, но не интерпретирует их - он просто ищет последовательность строковых элементов, за которой следует закрывающая кавычка, где "строковые элементы" либо (символ, который не является обратной косой чертой, закрывающей кавычкой или символ новой строки - за исключением символов новой строки, допускаемых в тройных кавычках) или (обратный слеш, за которым следует любой отдельный символ).
Затем содержимое строки интерпретируется (обрабатываются обратные слэши) в зависимости от того, какая это строка.
r
Флаг перед строковым литералом влияет только на этот шаг.
Цитата из https://docs.python.org/3.4/reference/lexical_analysis.html:
Даже в необработанном литерале кавычки можно экранировать с помощью обратной косой черты, но обратная косая черта остается в результате; например, r "\" "является допустимым строковым литералом, состоящим из двух символов: обратной косой черты и двойной кавычки; r" \ "не является допустимым строковым литералом (даже необработанная строка не может заканчиваться нечетным числом обратных косых черт). В частности, необработанный литерал не может заканчиваться одним обратным слешем (так как обратный слеш будет экранировать следующий символ кавычки). Также обратите внимание, что одиночный обратный слеш, за которым следует символ новой строки, интерпретируется как эти два символа как часть литерала, а не как продолжение строки,
Таким образом, в необработанной строке обратный слеш не обрабатывается специально, кроме случаев, когда "
или же '
, Следовательно, r'\'
или же r"\"
не является допустимой строкой, поскольку правильная кавычка экранируется, что делает строковый литерал недействительным. В таком случае нет разницы, r
существует, т.е. r'\'
эквивалентно '\'
а также r"\"
эквивалентно "\"
,