Python Заменить \\ на \ - PullRequest
       27

Python Заменить \\ на \

30 голосов
/ 04 марта 2011

Так что я не могу понять это ... У меня есть строка, скажем, "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'

Есть личто-то мне здесь не хватает?

РЕДАКТИРОВАТЬ Я понимаю, что \ - это 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.Но замена не заменяет косые черты, как я и думал.

Ответы [ 6 ]

39 голосов
/ 04 марта 2011

Нет необходимости использовать замену для этого.

То, что у вас есть, является закодированной строкой (с использованием кодировки 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!'
7 голосов
/ 04 марта 2011

Вы пропали без вести, это \ является escape-символом.

Смотрите здесь: http://docs.python.org/reference/lexical_analysis.html в 2.4.1 «Escape-последовательность»

Самое главное, \ n - это символ новой строки. И \\ - экранированный экранирующий символ: D

>>> a = 'a\\\\nb'
>>> a
'a\\\\nb'
>>> print a
a\\nb
>>> a.replace('\\\\', '\\')
'a\\nb'
>>> print a.replace('\\\\', '\\')
a\nb
3 голосов
/ 04 марта 2011

Ваша исходная строка, 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
1 голос
/ 04 марта 2011
r'a\\nb'.replace('\\\\', '\\')

или

'a\nb'.replace('\n', '\\n')
1 голос
/ 04 марта 2011

В строковых литералах Python обратная косая черта является escape-символом. Это также верно, когда интерактивная подсказка показывает вам значение строки. Это даст вам буквенное представление кода строки. Используйте оператор print, чтобы увидеть, как на самом деле выглядит строка.

Этот пример показывает разницу:

>>> '\\'
'\\'
>>> print '\\'
\
1 голос
/ 04 марта 2011

Это потому, что даже в «сырых» строках (= строки с r перед начальными кавычками) неэкранированный escape-символ не может быть последним символом в строке. Это должно работать вместо:

'\\ '[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...