Python заменяет одиночную обратную косую черту двойным обратным слэшем
В python я пытаюсь заменить одиночную обратную косую черту ( "\" ) двойным обратным слэшем ( "\" ). У меня есть следующий код:
directory = string.replace("C:\Users\Josh\Desktop\20130216", "\", "\\")
Однако это дает сообщение об ошибке, в котором говорится, что ему не нравится двойной обратный слэш. Может ли кто-нибудь помочь?
Ответы
Ответ 1
Не нужно использовать str.replace
или string.replace
здесь, просто преобразуйте эту строку в необработанную строку:
>>> strs = r"C:\Users\Josh\Desktop\20130216"
^
|
notice the 'r'
Ниже приведена версия repr
указанной строки, поэтому вы видите \\
здесь.
Но фактически фактическая строка содержит только '\'
not \\
.
>>> strs
'C:\\Users\\Josh\\Desktop\\20130216'
>>> s = r"f\o"
>>> s #repr representation
'f\\o'
>>> len(s) #length is 3, as there only one `'\'`
3
Но когда вы собираетесь распечатать эту строку, вы не получите '\\'
на выходе.
>>> print strs
C:\Users\Josh\Desktop\20130216
Если вы хотите, чтобы строка отображала '\\'
во время print
, используйте str.replace
:
>>> new_strs = strs.replace('\\','\\\\')
>>> print new_strs
C:\\Users\\Josh\\Desktop\\20130216
repr
теперь будет отображаться \\\\
:
>>> new_strs
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'
Ответ 2
Используйте escape-символы: "full\\path\\here"
, "\\"
и "\\\\"
Ответ 3
Позвольте мне сделать это простым и понятным. Давайте используем модуль re в python, чтобы избежать специальных символов.
Python script:
import re
s = "C:\Users\Josh\Desktop"
print s
print re.escape(s)
Выход:
C:\Users\Josh\Desktop
C:\\Users\\Josh\\Desktop
Объяснение:
Теперь обратите внимание, что функция re.escape при экранировании специальных символов в данной строке позволяет добавить другую обратную косую черту перед каждой обратной косой чертой, и, наконец, результат приводит к двойной обратной косой черте, нужный результат.
Надеюсь, это поможет вам.
Ответ 4
В python \
(обратная косая черта) используется как escape-символ. Это означает, что в тех местах, где вы хотите вставить специальный символ (например, новую строку), вы должны использовать обратную косую черту и другой символ (\n
для новой строки)
При использовании вашего примера вы заметите, что когда вы поместите "C:\Users\Josh\Desktop\20130216"
в repl, вы получите "C:\\Users\\Josh\\Desktop\x8130216"
. Это связано с тем, что \2
имеет особое значение в укусе python. Если вы хотите указать \
, тогда вам нужно поместить два \\
в вашу строку.
"C:\\Users\\Josh\\Desktop\\28130216"
Другой вариант - уведомить python о том, что все ваши жало не должны использовать \
в качестве escape-символа, предварительно ожидая жало с помощью r
r"C:\Users\Josh\Desktop\20130216"
Это "сырая" строка и очень полезна в ситуациях, когда вам нужно использовать множество обратных косых черт, например, при регулярных выражениях.
Если вы все же захотите заменить этот одиночный \
на \\
, вы должны использовать:
directory = string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\\\")
Обратите внимание на, что я не использую r'
в последних двух укусах выше. Это связано с тем, что, когда вы используете форму stings r'
, вы не можете завершить эту строку одним \
Почему исходные строковые литералы Python не заканчиваются одним обратным слэшем?
https://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-are-escape-characters/
Ответ 5
Возможно, синтаксическая ошибка в вашем случае,
вы можете изменить строку на:
directory = str(r"C:\Users\Josh\Desktop\20130216").replace('\\','\\\\')
который дает вам следующий результат:
C:\\Users\\Josh\\Desktop\\20130216
Ответ 6
Учитывая исходную строку, манипуляция с os.path может иметь больше смысла, но здесь есть строковое решение;
>>> s=r"C:\Users\Josh\Desktop\\20130216"
>>> '\\\\'.join(filter(bool, s.split('\\')))
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'
Обратите внимание, что split
рассматривает \\
в исходной строке как разделительную пустую строку. Использование filter
избавляется от этих пустых строк, поэтому join
не будет удваивать уже удвоенные обратные слэши. К сожалению, если у вас есть 3 или более, они уменьшаются до удвоенной обратной косой черты, но я не думаю, что это вредит вам в выражении в виде окна.
Ответ 7
Обратная косая черта указывает на специальный escape-символ. Поэтому directory = path_to_directory.replace("\", "\\")
заставляет Python думать, что первый аргумент для замены не заканчивался до стартовой цитаты второго аргумента, поскольку он понимал конечную цитату как escape-символ.
directory=path_to_directory.replace("\\","\\\\")
Ответ 8
Использование:
string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\")
Побег над символом \
.