Почему я не могу завершить необработанную строку обратной косой чертой? [Дубликат]

На этот вопрос уже есть ответ:

Почему сырые строковые литералы Python не заканчиваются одним обратным слешем? 12 ответов

Я запутался здесь, хотя необработанные строки преобразуют каждый\ в\\ но когда это\ появляется в конце, это вызывает ошибку.

>>> r'so\m\e \te\xt'
'so\\m\\e \\te\\xt'

>>> r'so\m\e \te\xt\'
SyntaxError: EOL while scanning string literal

Обновить

Это теперь покрытоPython FAQs также: Почему сырые строки (r-строки) не могут заканчиваться обратной косой чертой?

Ответы на вопрос(4)

Решение Вопроса

\ Сбежать' или" в необработанных строках, так как иначе интерпретатор python не знает, где останавливается строка. В вашем примере вы избегаете закрытия'.

Иначе

r'it wouldn\'t be possible to store this string'
r'since it'd produce a syntax error without the escape'

Посмотрите на подсветку синтаксиса, чтобы понять, что я имею в виду.

 Ashwini Chaudhary23 июн. 2012 г., 10:48
но \ внутри строки также должен экранировать символ рядом с ними, вместо этого они просто преобразуются в \\.
 Eric23 июн. 2012 г., 10:50
@ AshwiniChaudhary: Нет, в необработанной строке, ``тольк экранирует символ кавычки.
 Lennart Regebro23 июн. 2012 г., 16:15
Этот ответ неверен. r '\' 'Создает "\\'" в Python 3, поэтому `на самом деле не экранирует'. В данном случае документация неясна, экранирования не происходит, только синтаксический анализ строкового литерала дает ошибку.
 Ashwini Chaudhary23 июн. 2012 г., 10:53
да, ТАК не позволяет мне писать ни одного \ в формате кода;) Спасибо, я понял.
 Eric23 июн. 2012 г., 10:54
Конечно, это так:\

а того, как работает парсер (однако, фактического экранирования не происходит). Обходной путь - добавить обратную косую черту в виде необработанного строкового литерала впоследствии:

>>> print(r'foo\')
  File "<stdin>", line 1
    print(r'foo\')
                 ^
SyntaxError: EOL while scanning string literal
>>> print(r'foo''\\')
foo\

Не очень, но это работает. Вы можете добавить плюс, чтобы прояснить происходящее, но это не обязательно:

>>> print(r'foo' + '\\')
foo\

Сначала токенизатор ищет заключительную цитату. Он распознает обратную косую черту, когда это делает, но не интерпретирует их - он просто ищет последовательность строковых элементов, за которой следует закрывающая кавычка, где «строковые элементы» либо (символ, который не является обратной косой чертой, закрывающей кавычкой или символ новой строки - за исключением того, что в тройных кавычках разрешены символы новой строки) или (обратный слеш, за которым следует любой одиночный символ).

Затем содержимое строки интерпретируется (обрабатываются обратные слэши) в зависимости от того, какая это строка.r флаг перед строковым литералом влияет только на этот шаг.

 Logic Knight17 мая 2015 г., 06:36
Кажется, что сканер Python хранит 'r' в качестве токена, а затем продолжает сканировать строку, используядефол правила обработки строк, а не правила, в которых символ слэша рассматривается как обычный символ. Эта проблема обсуждается на Stackoverflow.com / д / 30283082/3259619.

https: //docs.python.org/3.4/reference/lexical_analysis.html#literal:

Даже в необработанном литерале кавычки можно экранировать с помощью обратной косой черты, но обратная косая черта остается в результате; например,r "\" "- допустимый строковый литерал, состоящий из двух символов: обратной косой черты и двойной кавычки; r "\" не является допустимым строковым литералом (даже необработанная строка не может заканчиваться нечетным числом обратных косых черт). В частности, необработанный литерал не может заканчиваться одним обратным слешем (так как обратный слеш будет экранировать следующий символ кавычки). Также обратите внимание, что одиночная обратная косая черта, за которой следует новая строка, интерпретируется как эти два символа как часть литерала, а не как продолжение строки.

Так что в необработанной строке обратный слеш не обрабатывается специально,Кром когда предшествует" или'. Следовательно,r'\' илиr"\" не является допустимой строкой, поскольку правильная кавычка экранируется, что делает строковый литерал недействительным. В таком случае нет разницы, является лиr существует, то естьr'\' эквивалентно'\' а такжеr"\" эквивалентно"\".

Ваш ответ на вопрос