Необработанная буквенная строка Python
str = r'c:\path\to\folder\' # my comment
- IDE: Затмение
- python2.6
Когда последний символ в строке является обратной косой чертой, создается впечатление, что он уходит от последней одинарной кавычки и рассматривает мой комментарий как часть строки. Но необработанная строка должна игнорировать все escape-символы, верно? Что может быть не так? Благодарю.
2 ответа
Необработанные строковые литералы не обрабатывают обратную косую черту как инициирующую escape-последовательность, за исключением случаев, когда непосредственно следующий символ является символом кавычки, который разделяет литерал, и в этом случае обратный слеш экранирует его.
Мотивация проектирования заключается в том, что необработанные строковые литералы действительно существуют только для удобства ввода шаблонов регулярных выражений - и все, никакой другой цели проектирования для таких литералов не существует. И шаблоны RE никогда не должны заканчиваться обратной косой чертой, но они могут включать в себя все виды символов кавычек, откуда правило.
Многие люди пытаются использовать необработанные строковые литералы, чтобы позволить им вводить пути Windows так, как они привыкли (с обратной косой чертой) - но, как вы заметили, это использование ломается, когда вам нужен путь, заканчивающийся обратной косой чертой. Как правило, самое простое решение - использовать прямые косые черты, которые среда выполнения C Microsoft и все версии Python поддерживают как полностью эквивалентные по путям:
s = 'c:/path/to/folder/'
(примечание: не скрывайте встроенные имена, такие как str
с вашими собственными идентификаторами - это ужасная практика, без каких-либо улучшений, и если вы не привыкнете избегать этой ужасной практики, однажды вы обнаружите, что столкнулись с проблемой неприятного отладки, когда какая-то часть вашего кода попирает над встроенным именем, и другая часть должна использовать встроенное имя в его реальном значении).
Это IMHO несоответствие в Python, но это описано в документации. Перейти ко второму последнему абзацу:
http://docs.python.org/reference/lexical_analysis.html
r"\" не является допустимым строковым литералом (даже необработанная строка не может заканчиваться нечетным числом обратных косых черт)