Подтвердить что ты не робот

Python Literal r '\' Не принимается

r'\' в Python работает не так, как ожидалось. Вместо того, чтобы возвращать строку с одним символом (обратная косая черта) в ней, она вызывает синтаксический эффект. r"\" делает то же самое.

Это довольно громоздко, если у вас есть список путей Windows, подобных этим:

paths = [ r'\bla\foo\bar',
          r'\bla\foo\bloh',
          r'\buff',
          r'\',
          # ...
        ]

Есть ли веская причина, почему этот литерал не принят?

4b9b3361

Ответ 1

Ответ на мой вопрос ( "Почему обратная косая черта не разрешена в качестве последнего символа в необработанных строках?" ), на самом деле мне кажется, что это "конструктивное решение", а тем более сомнительное.

В некоторых ответах выяснилось, что лексер и некоторые синтаксические прожекторы проще. Я не согласен (и у меня есть некоторый опыт написания парсеров и компиляторов, а также разработки IDE). Было бы проще определить необработанные строки с семантикой, что обратная косая черта не имеет никакого особого значения. Это облегчит использование как lexer, так и IDE.

Текущая ситуация также есть wart: в случае, если я хочу котировку в исходной строке, я все равно не могу ее использовать. Я могу использовать его только в том случае, если мне понадобится обратная косая черта, сопровождаемая цитатой внутри моей исходной строки.

Я бы предложил изменить это, но я также вижу проблему срыва существующего кода: -/

Ответ 2

Это соответствует документации :

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

Используйте "\\" вместо этого или, лучше, используйте / в качестве разделителя путей (да, это работает в Windows).

Ответ 3

Обратная косая черта может использоваться, чтобы сделать следующую цитату, не заканчивая строку:

>>> r'\''
"\\'"

So r'foo\' или r'\' - это неисчерпаемые литералы.

Обоснование

Поскольку вы специально задали аргументы в пользу этого проектного решения, соответствующие аспекты могут быть следующими (хотя, конечно, все это основано на спекуляциях):

  • Упрощает лексирование для самого интерпретатора Python (все строковые литералы имеют одинаковую семантику: закрывающая цитата, за которой следует нечетное число обратных косых черт, завершает строку)
  • Упрощает лексирование для синтаксических движков подсветки (это сильный аргумент, потому что большинство языков программирования не имеют необработанных строк, которые все еще заключены в одиночные или двойные кавычки, и много синтаксических движков подсветки сильно нарушены, потому что они используют несоответствующие инструменты, такие как обычные выражения для лексики)

Итак, есть, вероятно, важные причины, по которым этот способ был выбран, даже если вы не согласны с ними, потому что считаете, что ваш конкретный вариант использования более важен. Однако это не так по следующим причинам:

  • Вы можете просто использовать обычные строковые литералы и избегать обратных косых черт или читать строки из необработанного файла
  • обратные косые черты в строковых литералах обычно необходимы в одном из этих двух случаев:
    • вы предоставляете строку в качестве входного сигнала для интерпретатора другого языка, который использует обратную косую черту как символ кавычек, например, регулярные выражения. В этом случае вам не понадобится обратная косая черта в конце строки
    • вы используете \ как разделитель путей, который обычно не нужен, поскольку Python поддерживает / как разделитель путей в Windows и потому что там os.path.sep.

Решение

Вместо этого вы можете использовать '\\' или "\\":

>>> print("\\")
\

Или, если вы полностью сумасшедший, вы можете использовать сырой строковый литерал и объединить их с обычными литералами только для окончательной обратной косой черты или даже использовать нарезку строк:

>>> r'C:\some\long\freakin\file\path''\\'
'C:\\some\\long\\freakin\\file\\path\\'
>>> r'C:\some\long\freakin\file\path\ '[:-1]
'C:\\some\\long\\freakin\\file\\path\\'

Или, в вашем конкретном случае, вы можете просто сделать:

paths = [ x.replace('/', '\\') for x in '''

  /bla/foo/bar
  /bla/foo/bloh
  /buff
  /

'''.strip().split()]

Что бы сэкономить вам написание при добавлении дополнительных путей, в качестве дополнительного бонуса.

Ответ 4

Это потому, что в сырых строках вам нужен способ избежать одиночных кавычек, когда строка разделяется одинарными кавычками. То же самое с двойными кавычками.

http://docs.python.org/reference/lexical_analysis.html#string-literals

Ответ 5

Чтобы решить вашу проблему с корнем, вы можете использовать / в путях в Windows на Python просто отлично.

Синтаксис r'' и r"" (raw) предназначен в основном для работы с регулярными выражениями. На самом деле вам ничего не получается в случае работы с такими путями, как вы ожидаете, особенно там, где строка заканчивается на \.

В противном случае, если вы настаиваете на использовании \, используйте либо '\\' или "\\", вам нужно избежать escape-символа, который равен \; это не очень, использование / или os.path.sep - лучшее решение.