Строковая строка строки Python

str = r'c:\path\to\folder\'   # my comment
  • IDE: Затмение
  • python2.6

Когда последний символ в строке является обратной косой чертой, создается впечатление, что он уходит от последней одинарной кавычки и рассматривает мой комментарий как часть строки. Но необработанная строка должна игнорировать все escape-символы, верно? Что может быть не так? Благодарю.

Ответ 1

Необработанные строковые литералы не обрабатывают обратные слэши как инициирующие escape-последовательности, за исключением случаев, когда непосредственно следующий символ является символом кавычки, который разделяет литерал, и в этом случае обратный слеш действительно избегает его.

Мотивация проектирования заключается в том, что необработанные строковые литералы действительно существуют только для удобства ввода шаблонов регулярных выражений - и все, никакой другой цели проектирования для таких литералов не существует. И шаблоны RE никогда не должны заканчиваться обратной косой чертой, но они могут включать все виды символов кавычек, откуда правило.

Многие люди пытаются использовать необработанные строковые литералы, чтобы позволить им вводить пути Windows так, как они привыкли (с обратной косой чертой) - но, как вы заметили, это использование ломается, когда вам нужен путь, заканчивающийся обратной косой чертой. Обычно самое простое решение - использовать прямые косые черты, которые во время выполнения Microsoft C и во всех версиях Python полностью эквивалентны путям:

s = 'c:/path/to/folder/'

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

Ответ 2

Это ИМХО несогласованность в Python, но она описана в документации. Перейдите ко второму последнему абзацу:

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

r "\" не является допустимым строковым литералом (даже необработанная строка не может закончиться нечетное число обратных косых черт)