如何修复 Python 中的“SyntaxWarning:无效的转义序列”?
- 2025-03-05 09:14:00
- admin 原创
- 596
问题描述:
我在 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 \n """
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 (
它们是什么意思?我该如何修复它们?
在 Python 3.12+ 中,错误消息从 更改为DeprecationWarning
( SyntaxWarning
changelog):
SyntaxWarning: invalid escape sequence 'A'
解决方案 1:
``是 Python 字符串文字中的转义字符。
例如如果您想在字符串中放置一个制表符,您可以使用:
>>> print("foo bar")
foo bar
如果要将文字放入`字符串中,可以使用
\`:
>>> print("foo \\ bar")
foo bar
或者您可以使用“原始字符串”:
>>> print(r"foo bar")
foo bar
您不能在需要时随时在字符串文字中加上反斜杠。只有当反斜杠是有效转义序列的一部分时才允许使用,否则会导致DeprecationWarning
(< 3.12) 或SyntaxWarning
(3.12+)。例如,A
这不是有效的转义序列:
$ python3.6 -Wd -c '"A"'
<string>:1: DeprecationWarning: invalid escape sequence A
$ python3.12 -c '"A"'
<string>:1: SyntaxWarning: invalid escape sequence 'A'
如果您的反斜杠序列确实意外地与 Python 的转义序列之一匹配,但您不是故意的,那么情况会更糟,因为数据在没有任何错误或警告的情况下就被损坏了。
因此您应该始终使用原始字符串或\
。
重要的是要记住,即使字符串旨在用作正则表达式,它仍然是字符串文字。Python的正则表达式语法支持许多以 开头的特殊序列`。例如,
A匹配字符串的开头。但
A`在 Python 字符串文字中无效!这是无效的:
my_regex = "Afoo"
相反你应该这样做:
my_regex = r"Afoo"
文档字符串是另一个需要记住的内容:文档字符串也是字符串文字,文档字符串中的无效序列也是无效的!`r"""raw strings"""`如果文档字符串必须包含,则使用
。
解决方案 2:
为了方便起见,您可以使用以下方法自动添加r
到文档字符串:
使用例如编写脚本
libcst
来解析源代码,修改它以r
在适当的位置添加,然后将其写回在你的代码上运行脚本
与 AST 相比,使用 CST 的优势在于,例如可以保留括号或空格的数量。
您可以选择自动编写脚本,或者 GPT o3-mini 能够为您编写脚本。我在https://duck.ai上使用以下提示成功编写了脚本:
使用 libcst 编写 Python 程序以自动将 r 添加到会引发语法警告(无效转义序列)的文档字符串中
由于不允许发布由生成式 AI 工具生成的答案,因此您可以自己在 AI 工具上使用以下提示。为方便起见,我将收到的回复放在了https://gist.github.com/user202729/78846233ae50f298cd1d20a8f79cf86e上,不过您应该能够使用上面概述的说明获得相同的回复。
使用示例:
[]$ cat a.py
def f():
"""
hello s world
"""
print("d")
[]$ python code-slightly-modified.py a.py
[]$ cat a.py
def f():
r"""
hello s world
"""
print("d")
解决方案 3:
在文档字符串中使用单个反斜杠时收到转义警告:
"""
recursive calculation of T-polynomials
$x in mathbb{R}^n$
$T_0(x) := (1,...,1)in mathbb{R}^n$
$T_1(x) := xinmathbb{R}^n$
$T_{n+2} := 2*x*T_{n+1}(x) - T_n(x)$
"""
但是当我使用如下“正常”注释时警告就消失了:
#"""
#recursive calculation of T-polynomials
#$x in mathbb{R}^n$
#$T_0(x) := (1,...,1)in mathbb{R}^n$
#$T_1(x) := xinmathbb{R}^n$
#$T_{n+2} := 2*x*T_{n+1}(x) - T_n(x)$
#"""
扫码咨询,免费领取项目管理大礼包!