Технически, любое нечетное количество обратной косой черты, как описано в документации .
>>> r'\'
File "<stdin>", line 1
r'\'
^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
File "<stdin>", line 1
r'\\\'
^
SyntaxError: EOL while scanning string literal
Кажется, что синтаксический анализатор может просто обрабатывать обратную косую черту в необработанных строках как обычные символы (не в этом ли смысл необработанные строки?), Но я, вероятно, упускаю что-то очевидное.
Ответы:
Причина объяснена в той части этого раздела, которую я выделил жирным шрифтом:
Таким образом, необработанные строки не являются на 100% необработанными, все еще существует некоторая элементарная обратная косая обработка.
источник
r"foo\bar\baz" "\\"
(переносить в parens, если он неоднозначный) создаст один литерал во время компиляции, первая часть которого является необработанной, и только последний маленький бит не является необработанным, чтобы обеспечить обратную косую черту.Весь заблуждение о необработанных строках python заключается в том, что большинство людей считают, что обратный слеш (внутри необработанной строки) является обычным символом, как и все остальные. Это не. Ключ к пониманию - последовательность обучения этого питона:
Таким образом, любой символ после обратной косой черты является частью необработанной строки. Когда синтаксический анализатор вводит необработанную строку (отличную от Unicode) и встречает обратную косую черту, он знает, что есть 2 символа (обратная косая черта и символ после нее).
Сюда:
и:
Последний случай показывает, что в соответствии с документацией теперь парсер не может найти закрывающую кавычку, так как последняя кавычка, которую вы видите выше, является частью строки, то есть обратная косая черта здесь не может быть последней, поскольку она будет «пожирать» закрывающий символ строки.
источник
Так оно и есть! Я вижу это как один из тех небольших дефектов в Python!
Я не думаю, что для этого есть веская причина, но это определенно не разбирается; действительно легко разобрать необработанные строки с \ в качестве последнего символа.
Уловка в том, что если вы позволите \ быть последним символом в необработанной строке, то вы не сможете поместить «внутри необработанной строки. Похоже, что python согласился с разрешением» вместо разрешения \ в качестве последнего символа.
Однако это не должно вызывать никаких проблем.
Если вы беспокоитесь о том, что не можете легко писать пути к папкам Windows, например,
c:\mypath\
не беспокойтесь, вы можете представлять их какr"C:\mypath"
, и, если вам нужно добавить имя подкаталога, не делайте это с конкатенацией строк, так как это не правильный способ сделать это в любом случае! использованиеos.path.join
источник
Для того, чтобы вы завершили необработанную строку косой чертой, я предлагаю вам использовать этот трюк:
источник
Другой трюк заключается в использовании chr (92), так как он оценивается как "\".
Недавно мне пришлось очистить строку от обратной косой черты, и следующее сделали свое дело:
Я понимаю, что это не заботится о «почему», но поток привлекает многих людей, ищущих решение неотложной проблемы.
источник
"\\"
(необработанная строка с обратной косой чертой)Поскольку \ "разрешено внутри необработанной строки. Тогда его нельзя использовать для определения конца строкового литерала.
Почему бы не прекратить синтаксический анализ строкового литерала, когда вы встречаете первый "?
Если бы это было так, то \ "не было бы разрешено внутри строкового литерала. Но это так.
источник
\"
любом месте строки с двойными кавычками , OR \ в конце строки с двойными кавычками . Статистика использования должна благоприятствовать двухсимвольной последовательности в любом месте по сравнению с односимвольной последовательностью в конце.Причина
r'\'
синтаксической неверности заключается в том, что, хотя строковое выражение является необработанным, используемые кавычки (одинарные или двойные) всегда должны быть экранированными, так как в противном случае они будут отмечать конец кавычки. Поэтому, если вы хотите выразить одну кавычку внутри строки в одинарных кавычках, нет другого способа, кроме как использовать\'
. То же самое относится к двойным кавычкам.Но вы можете использовать:
источник
Другой пользователь, который с тех пор удалил свой ответ (не уверен, что хотел бы получить кредит), предположил, что разработчики языка Python могут упростить конструкцию синтаксического анализатора, используя те же правила синтаксического анализа и расширив экранированные символы в необработанную форму в качестве запоздалой мысли. (если литерал был помечен как необработанный).
Я подумал, что это интересная идея, и я включаю ее в качестве сообщества вики для потомков.
источник
источник
Исходя из C, мне совершенно ясно, что одиночный \ работает как escape-символ, позволяя вам помещать в строки специальные символы, такие как переводы строк, табуляции и кавычки.
Это действительно запрещает \ как последний символ, поскольку он будет избегать "и заставит парсер задохнуться. Но, как указывалось ранее \, является законным.
источник
несколько советов:
1) если вам нужно манипулировать обратной косой чертой для пути, тогда стандартный модуль python os.path - ваш друг. например :
2) если вы хотите построить строки с обратной косой чертой в нем, НО без обратной косой черты в конце вашей строки, тогда raw строка является вашим другом (используйте префикс «r» перед вашей литеральной строкой). например :
3) если вам нужно поставить строку в переменной X с обратной косой чертой, то вы можете сделать это:
4) если вам нужно создать строку с обратной косой чертой в конце, объедините подсказки 2 и 3:
теперь lilypond_statement содержит
"\DisplayLilyMusic \upper"
да здравствует питон! :)
n3on
источник
os.path.normpath
, удалит хвостовую обратную косую черту ... Тогда как мне указать имя файла в пути ...Я столкнулся с этой проблемой и нашел частичное решение, которое хорошо в некоторых случаях. Несмотря на то, что python не может завершить строку одним обратным слэшем, его можно сериализовать и сохранить в текстовом файле с одним обратным слэшем в конце. Поэтому, если вам нужно сохранить текст с одной обратной косой чертой на вашем компьютере, это возможно:
Кстати, он не работает с json, если вы выгрузите его с помощью библиотеки json в Python.
Наконец, я работаю со Spyder и заметил, что если я открою переменную в текстовом редакторе Spider, дважды щелкнув по ее имени в проводнике переменных, он будет представлен с одной обратной косой чертой и может быть скопирован в буфер обмена таким образом (это не очень полезно для большинства потребностей, но, возможно, для некоторых ..).
источник