如何在Python中修复"<string> DeprecationWarning: invalid escape sequence"错误?

63

我在Python中收到很多这样的警告:

DeprecationWarning: invalid escape sequence \A
  orcid_regex = '\A[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]\Z'

DeprecationWarning: invalid escape sequence \/
  AUTH_TOKEN_PATH_PATTERN = '^\/api\/groups'

DeprecationWarning: invalid escape sequence \
  """

DeprecationWarning: invalid escape sequence \.
  DOI_PATTERN = re.compile('(https?://(dx\.)?doi\.org/)?10\.[0-9]{4,}[.0-9]*/.*')

<unknown>:20: DeprecationWarning: invalid escape sequence \(

<unknown>:21: DeprecationWarning: invalid escape sequence \(

它们是什么意思?我应该如何修复它们?


4
тюеPython 3.8-devСИГ№╝їУ┐Ўт░єу╗ЎСйаСИђСИфSyntaxWarningУђїСИЇТў»DeprecationWarning№╝їтљїТаиуџёУДБтє│Тќ╣ТАѕжђѓућесђѓ - RajaRaviVarma
2个回答

99

\是Python字符串字面值中的转义字符。

例如,如果您想在字符串中放置一个制表符,则应执行以下操作:

>>> print("foo \t bar")
foo      bar

如果你想在字符串中插入一个字面上的 \,你需要使用 \\
>>> print("foo \\ bar")
foo \ bar

或者使用“原始字符串”:

>>> print(r"foo \ bar")
foo \ bar

当你需要一个反斜杠时,不能随意在字符串文字中添加。当反斜杠后面没有有效的转义序列时,反斜杠是无效的,并且Python的新版本会打印出弃用警告。例如,\A不是转义序列。
$ python3.6 -Wd -c '"\A"'
<string>:1: DeprecationWarning: invalid escape sequence \A

如果你的反斜杠序列恰好匹配了Python的转义序列,但你并不是这个意思,那就更糟了。因此,你应该始终使用原始字符串或\\
重要的是要记住,字符串字面值即使被用作正则表达式,仍然是字符串字面值。Python的正则表达式语法支持许多以\\开头的特殊序列。例如,\A匹配一个字符串的开头。但是,在Python字符串字面值中,\A是无效的!这是无效的:
my_regex = "\Afoo"

相反,你应该这样做:

my_regex = r"\Afoo"

记住另一个东西:文档字符串。文档字符串也是字符串文字,无效的 \ 序列在文档字符串中也是无效的!如果文档字符串包含 \,请使用原始字符串(r"""...""")。


2
如果您有一个包含字符串的变量,但是如何将其转换为原始字符串以避免被错误解释呢?这种方式对我不起作用:r"{}".format(my_variable) - HaPsantran
原始字符串并不是与普通字符串不同的类型,它只是在源代码中以不同的方式编写字符串字面值的一种方法。一旦您有一个包含字符串的变量,它就是一个字符串。常规字符串和原始字符串之间没有区别或区分。 - AbrahamCoding
2
转义反斜杠适用于正则表达式中的转义点。这就是我遇到的情况。请参阅我的回答:“正则表达式匹配点”。所以,你必须使用"\\."r"\."而不是"\."。花了我一些时间才明白。你的回答帮了我大忙。谢谢。 - Gabriel Staples

0

当我将路径名称中的 \ 改为 \\ 时,解决了无效转义序列警告。请参考下面附上的截图。我在 PyCharm 中遇到了这个错误:

enter image description here

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接