Hi all,
Forgive my pool English first...
I'm learning Python recently. But I met with a problem yesterday and I have liitle experience in solving this kind of problems.
Here are the code in Python Shell:

>>> "HuXiaoxiang\\0Nanjing University\03 Years.".replace("\0"," ")
'HuXiaoxiang\\0Nanjing University\x03 Years.'
>>> "HuXiaoxiang \0Nanjing University\03 years.".replace("\0"," ")
'HuXiaoxiang  Nanjing University\x03 years.'
>>> "HuXiaoxiang \0Nanjing University\03 years.".replace(" ","@")
'HuXiaoxiang@\x00Nanjing@University\x03@years.'

Why the first & second didn't work as I excepted?
Thxs for anyone who will view my problem in advance~

Hi all,
Forgive my pool English first...
I'm learning Python recently. But I met with a problem yesterday and I have liitle experience in solving this kind of problems.
Here are the code in Python Shell:

>>> "HuXiaoxiang\\0Nanjing University\03 Years.".replace("\0"," ")
'HuXiaoxiang\\0Nanjing University\x03 Years.'
>>> "HuXiaoxiang \0Nanjing University\03 years.".replace("\0"," ")
'HuXiaoxiang  Nanjing University\x03 years.'
>>> "HuXiaoxiang \0Nanjing University\03 years.".replace(" ","@")
'HuXiaoxiang@\x00Nanjing@University\x03@years.'

Why the first & second didn't work as I excepted?
Thxs for anyone who will view my problem in advance~

Your problem is not with the replace() method but with the escaped characters in literal strings:

  • An escaped backslash "\\" is interpreted as a single backslash character in a literal string, so your first string contains a backslash character followed by the digit 0, and not the null character '\0'.
  • A backslash followed by 1, 2 or 3 octal digits is interpreted as the character which binary value has this number. For example, 'a' has order 97, which is written 141 in base 8, so the string "\141" is the same as "a" (an octal digit is 0, ..., 7). So in the second string, "\0" is interpreted as the null character but "\03" is the character with number 3, while "\09" would mean a null character followed by the digit 9, because 9 is not an octal digit.

Because they can have a variable number of digits, the octal escaped sequences are not very useful. The better way is to represent non printable characters with hexadecimal escaped sequences like "\x61" which contain \x followed by exactly 2 hexadecimal digits (0, .., 9, a, .., f or A, .. F). So your examples would be better written

>>> "HuXiaoxiang\\0Nanjing University\x003 Years.".replace("\x00"," ")
'HuXiaoxiang\\0Nanjing University 3 Years.'
>>> "HuXiaoxiang \x00Nanjing University\x03 years.".replace("\x00"," ")
'HuXiaoxiang  Nanjing University\x03 years.'
>>> "\x0hello"
ValueError: invalid \x escape

The last example was rejected because \x expects exactly 2 hexadecimal digits.

Edited 5 Years Ago by Gribouillis: n/a

Comments
nice explanation

Aha, I grasp your point of "literal string". A big thank you to you!
Thx Gribouillis~ It is clear now

This question has already been answered. Start a new discussion instead.