diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2022-12-28 05:39:53 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-28 05:39:53 (GMT) |
commit | 97a3e18c8873228a7ab7f720954798c2c5c7486d (patch) | |
tree | ae409445ce0d2d503d92fe7b615d6e7645007d42 | |
parent | 04285502ba7d90e41138b0282434372be18ac042 (diff) | |
download | cpython-97a3e18c8873228a7ab7f720954798c2c5c7486d.zip cpython-97a3e18c8873228a7ab7f720954798c2c5c7486d.tar.gz cpython-97a3e18c8873228a7ab7f720954798c2c5c7486d.tar.bz2 |
gh-55688: Add note about ending backslashes for raw strings (GH-94768)
(cherry picked from commit b95b1b3b25b0a93a22c7d58ac5bd5870e62070a8)
Co-authored-by: Stanley <46876382+slateny@users.noreply.github.com>
Co-authored-by: hauntsaninja <hauntsaninja@gmail.com>
-rw-r--r-- | Doc/faq/programming.rst | 40 | ||||
-rw-r--r-- | Doc/tutorial/introduction.rst | 5 |
2 files changed, 45 insertions, 0 deletions
diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index bd75801..1bcca4c 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -1026,6 +1026,46 @@ What does 'UnicodeDecodeError' or 'UnicodeEncodeError' error mean? See the :ref:`unicode-howto`. +.. _faq-programming-raw-string-backslash: + +Can I end a raw string with an odd number of backslashes? +--------------------------------------------------------- + +A raw string ending with an odd number of backslashes will escape the string's quote:: + + >>> r'C:\this\will\not\work\' + File "<stdin>", line 1 + r'C:\this\will\not\work\' + ^ + SyntaxError: unterminated string literal (detected at line 1) + +There are several workarounds for this. One is to use regular strings and double +the backslashes:: + + >>> 'C:\\this\\will\\work\\' + 'C:\\this\\will\\work\\' + +Another is to concatenate a regular string containing an escaped backslash to the +raw string:: + + >>> r'C:\this\will\work' '\\' + 'C:\\this\\will\\work\\' + +It is also possible to use :func:`os.path.join` to append a backslash on Windows:: + + >>> os.path.join(r'C:\this\will\work', '') + 'C:\\this\\will\\work\\' + +Note that while a backslash will "escape" a quote for the purposes of +determining where the raw string ends, no escaping occurs when interpreting the +value of the raw string. That is, the backslash remains present in the value of +the raw string:: + + >>> r'backslash\'preserved' + "backslash\\'preserved" + +Also see the specification in the :ref:`language reference <strings>`. + Performance =========== diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 558b1c3..b7a8990 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -189,6 +189,11 @@ the first quote:: >>> print(r'C:\some\name') # note the r before the quote C:\some\name +There is one subtle aspect to raw strings: a raw string may not end in +an odd number of ``\`` characters; see +:ref:`the FAQ entry <faq-programming-raw-string-backslash>` for more information +and workarounds. + String literals can span multiple lines. One way is using triple-quotes: ``"""..."""`` or ``'''...'''``. End of lines are automatically included in the string, but it's possible to prevent this by adding a ``\`` at |