43

So I can't seem to figure this out... I have a string say, "a\\nb" and I want this to become "a\nb". I've tried all the following and none seem to work;

>>> 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'

I really don't understand why the last one works, because this works fine:

>>> a.replace("\\","%")
'a%nb'

Is there something I'm missing here?

EDIT I understand that \ is an escape character. What I'm trying to do here is turn all \\n \\t etc. into \n \t etc. and replace doesn't seem to be working the way I imagined it would.

>>> a = "a\\nb"
>>> b = "a\nb"
>>> print a
a\nb
>>> print b
a
b
>>> a.replace("\\","\\")
'a\\nb'
>>> a.replace("\\\\","\\")
'a\\nb'

I want string a to look like string b. But replace isn't replacing slashes like I thought it would.

Jochen Ritzel
  • 104,512
  • 31
  • 200
  • 194
kand
  • 2,268
  • 6
  • 31
  • 43
  • 4
    Your original string, `a = 'a\\nb'` does not actually have two `'\'` characters, the first one is an escape for the latter. If you do, `print a`, you'll see that you actually have only one `'\'` character. – Santa Mar 03 '11 at 21:44

9 Answers9

57

There's no need to use replace for this.

What you have is a encoded string (using the string_escape encoding) and you want to decode it:

>>> 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'

In Python 3:

>>> import codecs
>>> codecs.decode('\\n\\x21', 'unicode_escape')
'\n!'
Scott Martin
  • 1,260
  • 2
  • 17
  • 27
Jochen Ritzel
  • 104,512
  • 31
  • 200
  • 194
13

You are missing, that \ is the escape character.

Look here: http://docs.python.org/reference/lexical_analysis.html at 2.4.1 "Escape Sequence"

Most importantly \n is a newline character. And \\ is an escaped escape character :D

>>> a = 'a\\\\nb'
>>> a
'a\\\\nb'
>>> print a
a\\nb
>>> a.replace('\\\\', '\\')
'a\\nb'
>>> print a.replace('\\\\', '\\')
a\nb
sleeplessnerd
  • 21,853
  • 1
  • 25
  • 29
3
r'a\\nb'.replace('\\\\', '\\')

or

'a\nb'.replace('\n', '\\n')
nmichaels
  • 49,466
  • 12
  • 107
  • 135
3

Your original string, a = 'a\\nb' does not actually have two '\' characters, the first one is an escape for the latter. If you do, print a, you'll see that you actually have only one '\' character.

>>> a = 'a\\nb'
>>> print a
a\nb

If, however, what you mean is to interpret the '\n' as a newline character, without escaping the slash, then:

>>> b = a.replace('\\n', '\n')
>>> b
'a\nb'
>>> print b
a
b
Santa
  • 11,381
  • 8
  • 51
  • 64
1

It's because, even in "raw" strings (=strings with an r before the starting quote(s)), an unescaped escape character cannot be the last character in the string. This should work instead:

'\\ '[0]
Abbafei
  • 3,088
  • 3
  • 27
  • 24
1

In Python string literals, backslash is an escape character. This is also true when the interactive prompt shows you the value of a string. It will give you the literal code representation of the string. Use the print statement to see what the string actually looks like.

This example shows the difference:

>>> '\\'
'\\'
>>> print '\\'
\
Brian Goldman
  • 716
  • 3
  • 11
0

In Python 3 it will be:

bytes(s, 'utf-8').decode("unicode_escape")
Raj Ratn
  • 109
  • 1
  • 5
-1

This works on Windows with Python 3.x:

import os
str(filepath).replace(os.path.sep, '/')

Where: os.path.sep is \ on Windows and / on Linux.

Case study

Used this to prevent errors when generating a Markdown file then rendering it to pdf.

Contango
  • 76,540
  • 58
  • 260
  • 305
-2
path = "C:\\Users\\Programming\\Downloads"
# Replace \\ with a \ along with any random key multiple times
path.replace('\\', '\pppyyyttthhhooonnn')
# Now replace pppyyyttthhhooonnn with a blank string
path.replace("pppyyyttthhhooonnn", "")

print(path)

#Output... C:\Users\Programming\Downloads