Python Заменить\\с \
Так что я не могу понять это... У меня строка, "a\\nb"
, и я хочу, чтобы это стало "a\nb"
. Я пробовал все следующее, и никто не работает,
>>> a
'a\\nb'
>>> a.replace("\\","\")
File "<stdin>", line 1
a.replace("\\","\")
^
SyntaxError: EOL while scanning string literal
>>> a.replace("\\",r"\")
File "<stdin>", line 1
a.replace("\\",r"\")
^
SyntaxError: EOL while scanning string literal
>>> a.replace("\\",r"\\")
'a\\\\nb'
>>> a.replace("\\","\\")
'a\\nb'
Я действительно не понимаю, почему работает последний, потому что это прекрасно работает:
>>> a.replace("\\","%")
'a%nb'
Я здесь что-то не хватает?
EDIT Я понимаю, что\является escape-символом. То, что я пытаюсь сделать здесь, - это превратить все \\n
\\t
и т.д. В \n
\t
и т.д., И замена, похоже, не работает так, как я себе представлял.
>>> a = "a\\nb"
>>> b = "a\nb"
>>> print a
a\nb
>>> print b
a
b
>>> a.replace("\\","\\")
'a\\nb'
>>> a.replace("\\\\","\\")
'a\\nb'
Я хочу, чтобы строка a выглядела как строка b. Но замена не заменяет косые черты, как я думал, что это будет.
Ответы
Ответ 1
Нет причин использовать замену для этого, Python поставляется с включенными батареями.
У вас есть закодированная строка (с использованием кодировки string_escape
), и вы хотите ее декодировать:
>>> s = r"Escaped\nNewline"
>>> print s
Escaped\nNewline
>>> s.decode('string_escape')
'Escaped\nNewline'
>>> print s.decode('string_escape')
Escaped
Newline
>>> "a\\nb".decode('string_escape')
'a\nb'
В Python 3:
>>> import codecs
>>> codecs.decode('\\n\\x21', 'unicode_escape')
'\n!'
Ответ 2
Вам не хватает, что\является escape-символом.
Посмотрите здесь: http://docs.python.org/reference/lexical_analysis.html
на 2.4.1 "Escape Sequence"
Самое главное \n - символ новой строки.
И \\- экранированный escape-символ: D
>>> a = 'a\\\\nb'
>>> a
'a\\\\nb'
>>> print a
a\\nb
>>> a.replace('\\\\', '\\')
'a\\nb'
>>> print a.replace('\\\\', '\\')
a\nb
Ответ 3
В строковых литералах Python обратная косая черта - это escape-символ. Это также верно, когда интерактивная подсказка показывает вам значение строки. Это даст вам буквальное представление строки. Используйте оператор print
, чтобы увидеть, как выглядит строка.
В этом примере показана разница:
>>> '\\'
'\\'
>>> print '\\'
\
Ответ 4
В исходной строке a = 'a\\nb'
на самом деле нет двух символов '\'
, первый - это побег для последнего. Если вы это сделаете, print a
, вы увидите, что на самом деле у вас есть только один символ '\'
.
>>> a = 'a\\nb'
>>> print a
a\nb
Если, однако, вы имеете в виду интерпретировать '\n'
как символ новой строки, не выходя из косой черты, а затем:
>>> b = a.replace('\\n', '\n')
>>> b
'a\nb'
>>> print b
a
b
Ответ 5
Это потому, что даже в "сырых" строках (= строки с r
до стартовой цитаты) неэкранированный escape-символ не может быть последним символом в строке. Это должно работать вместо:
'\\ '[0]
Ответ 6
r'a\\nb'.replace('\\\\', '\\')
или
'a\nb'.replace('\n', '\\n')