Например следующий код не выдаст ошибки:
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
Комментариев нет:
Отправить комментарий