Why can't Python's raw string literals end with a single backslash?
--
Music by Eric Matyas
https://www.soundimage.org
Track title: Cool Puzzler LoFi
--
Chapters
00:00 Question
00:42 Accepted answer (Score 160)
01:38 Answer 2 (Score 175)
02:46 Answer 3 (Score 32)
03:50 Answer 4 (Score 29)
04:19 Thank you
--
Full question
https://stackoverflow.com/questions/6477...
Question links:
[the documentation]: http://docs.python.org/reference/lexical...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #string #literals #rawstring
#avk47
ACCEPTED ANSWER
Score 172
The reason is explained in the part of that section which I highlighted in bold:
String quotes can be escaped with a backslash, but the backslash remains in the string; for example,
r"\""is a valid string literal consisting of two characters: a backslash and a double quote;r"\"is not a valid string literal (even a raw string cannot end in an odd number of backslashes). Specifically, a raw string cannot end in a single backslash (since the backslash would escape the following quote character). Note also that a single backslash followed by a newline is interpreted as those two characters as part of the string, not as a line continuation.
So raw strings are not 100% raw, there is still some rudimentary backslash-processing.
ANSWER 2
Score 38
That's the way it is! I see it as one of those small defects in python!
I don't think there's a good reason for it, but it's definitely not parsing; it's really easy to parse raw strings with \ as a last character.
The catch is, if you allow \ to be the last character in a raw string then you won't be able to put " inside a raw string. It seems python went with allowing " instead of allowing \ as the last character.
However, this shouldn't cause any trouble.
If you're worried about not being able to easily write windows folder pathes such as c:\mypath\ then worry not, for, you can represent them as r"C:\mypath", and, if you need to append a subdirectory name, don't do it with string concatenation, for it's not the right way to do it anyway! use os.path.join
>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'
ANSWER 3
Score 37
In order for you to end a raw string with a slash I suggest you can use this trick:
>>> print(r"c:\test"'\\')
c:\test\
It uses the implicit concatenation of string literals in Python and concatenates one string delimited with double quotes with another that is delimited by single quotes. Ugly, but works.
ANSWER 4
Score 18
Another trick is to use chr(92) as it evaluates to "\".
I recently had to clean a string of backslashes and the following did the trick:
CleanString = DirtyString.replace(chr(92),'')
I realize that this does not take care of the "why" but the thread attracts many people looking for a solution to an immediate problem.