Вопрос по python, string, rawstring – Почему я не могу завершить необработанную строку обратной косой чертой? [Дубликат]

8

This question already has an answer here:

Why can't Python's raw string literals end with a single backslash? 12 answers

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

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

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

Update:

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

Ваш Ответ

4   ответа
10

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

Иначе:

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

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

Error: User Rate Limit Exceeded'Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededonlyError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ashwini Chaudhary
Error: User Rate Limit Exceeded Ashwini Chaudhary
Error: User Rate Limit Exceeded\
3

Строки Python обрабатываются в два этапа:

  1. First the tokenizer looks for the closing quote. It recognizes backslashes when it does this, but doesn't interpret them - it just looks for a sequence of string elements followed by the closing quote mark, where "string elements" are either (a character that's not a backslash, closing quote or a newline - except newlines are allowed in triple-quotes), or (a backslash, followed by any single character).

  2. Then the contents of the string are interpreted (backslash escapes are processed) depending on what kind of string it is. The r flag before a string literal only affects this step.

Error: User Rate Limit ExceededdefaultError: User Rate Limit Exceededstackoverflow.com/q/30283082/3259619.
6

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

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

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

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

Цитата изhttps://docs.python.org/3.4/reference/lexical_analysis.html#literals:

Even in a raw literal, quotes can be escaped with a backslash, but the backslash remains in the result; for example, r"\"" is a valid string literal consisting of two characters: a backslash and a double quote; r"\" is not a valid string literal (even a raw string cannot end in an odd number of backslashes). Specifically, a raw literal cannot end in a single backslash (since the backslash would escape the following quote character). Note also that a single backslash followed by a newline is interpreted as those two characters as part of the literal, not as a line continuation.

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

Похожие вопросы