Страницы

Поиск по вопросам

среда, 21 ноября 2018 г.

Почему в середине raw-строки не может быть четное количество обратных слешей совместно с "(')

Например следующий код не выдаст ошибки:
rs = r'Cat\'s home'
А этот код выдаст:
rs = r'Cat\\'s home'
То же самое, так ошибки не будет:
rs = r'Cat\\\'s home'
А этот код выдаст:
rs = r'Cat\\\\'s home'
И так далее...
Этот факт я запомнил, но почему так получается не понимаю


Ответ

Ответ пользователя @Vitalts дан про обычные строки. В raw строках (строки, предназначенные для регулярных выражениях) правила обработки слешей несколько другие.

Из спецификации языка Питон
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).
Перевод:
Даже в raw строковых константах, кавычки можно экранировать с помощью слеша, но слеш остаётся в результате, например, r'\'' является верной строковой константой, состоящей из двух символов: слеш и кавычка. r'\'— не является корректной константой (даже raw строки не могут оканчиваться нечётным кол-вом слешей, так как слеш экранирует закрывающую кавычку).
При этом несмотря на то, что слеш экранирует кавычки, он не выкидывается из строки; то же происходит и для последовательности из двух слешэй.

Таким образом, этот ответ все же пересекается с ответом @Vitalts:
r'a\'
EOL while scanning string literal: Строка не закончилась, так как последняя кавычка экранирована и является частью строки.
r'a\\'
Всё хорошо: строка закончилась, так как первый слеш экранирует второй.
r'\\\'
Далее по аналогии...

r'1 \' 2'
Всё ок: кавычка в середине экранирована.
r'1 \\' 2'
Первый слеш экранировал второй, после чего строка закончилась. Теперь 2' уже не относится к строке, отсюда invalid syntax

Комментариев нет:

Отправить комментарий