2012-06-23 5 views
7

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

>>> 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 FAQs, а также: Why can’t raw strings (r-strings) end with a backslash?

ответ

10

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

В противном случае:

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

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

+0

, но внутри \ внутри строки также следует избегать символа рядом с ним, вместо этого они просто преобразуются в \\. –

+0

@AshwiniChaudhary: Нет, в исходной строке символ '\' _only_ пропускает символ кавычки. – Eric

+0

yes, SO не позволяет мне написать одиночный \ in форматирование кода;) Спасибо, я понял. –

3

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

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

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

+0

Кажется, сканер Python хранит «r» в качестве токена, затем продолжает сканировать строку, используя правила обработки строки * по умолчанию *, вместо правил, в которых baskslash рассматривается как обычный символ. Этот вопрос обсуждается на http://stackoverflow.com/q/30283082/3259619. – CarpetPython

5

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

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

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

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

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

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

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

Смежные вопросы