Страницы

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

понедельник, 23 декабря 2019 г.

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

#python


Например следующий код не выдаст ошибки:

 rs = r'Cat\'s home'


А этот код выдаст:

rs = r'Cat\\'s home'


То же самое, так ошибки не будет:

 rs = r'Cat\\\'s home'


А этот код выдаст:

rs = r'Cat\\\\'s home'


И так далее...

Этот факт я запомнил, но почему так получается не понимаю
    


Ответы

Ответ 1



Ответ пользователя @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

Ответ 2



Потому, что обратный слеш - спец символ, который требуется экранировать вторым обратным слешем. Одинарная кавычка, в данном случае, также требует экранирование обратным слешем (поскольку она используется для выделения строки, если строку обрамите двойными кавычками, то в строке одинарная не требует экранирования и наоборот) Здесь вы обратным слешем экранируете одинарную кавычку rs = r'Cat\'s home' Здесь же появляется еще один обратный слеш, который требуется экранировать еще одним. rs = r'Cat\\'s home' Здесь же вы экранировали и второй слеш rs = r'Cat\\\'s home' А здесь добавили еще один слеш, который также требуется экранировать rs = r'Cat\\\\'s home'

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

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