Why can't Python's raw string literals end with a single backslash?
Hire the world's top talent on demand or became one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Lost Jungle Looping
--
Chapters
00:00 Why Can'T Python'S Raw String Literals End With A Single Backslash?
00:31 Accepted Answer Score 172
01:13 Answer 2 Score 38
02:04 Answer 3 Score 37
02:26 Answer 4 Score 18
02:47 Thank you
--
Full question
https://stackoverflow.com/questions/6477...
--
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.