Python中关于正则表达式字符串的PEP8警告,Eclipse

79

为什么Pep8在代码的下一个字符串上抱怨?

import re
re.compile("\d{3}")

我收到的警告:

ID:W1401  Anomalous backslash in string: '\d'. String constant might be missing an r prefix.

你能否解释一下此信息的含义?我需要更改代码中什么内容来通过警告W1401?

该代码已通过测试并按预期运行。此外,\d{3}是一个有效的正则表达式。

2个回答

115
"\\d"和"\"d\""是一样的,因为d没有转义序列。但对于代码读者来说不够清晰。

然而,考虑到\t,"\\t"代表制表符,而r"\\t"代表字面上的\t字符。

因此,在表示字面上的\d时,请使用原始字符串:

"
re.compile(r"\d{3}")

或者显式地转义反斜杠:

re.compile("\\d{3}")

谢谢,我之前不知道'r'前缀及其功能。 - alandarev
7
虽然有些晚,但是\d\\d并不相同。前者匹配任何(Unicode)数字;后者匹配反斜杠后跟着的字母"d"。它们并不等同。Pylint似乎在这里错了。 - Marek Jedliński
5
еңЁPythonдәӨдә’ејҸзҺҜеўғдёӯе°қиҜ•иҫ“е…Ҙ'\d' == '\\d'пјҢиҝҳеҸҜд»Ҙиҫ“е…Ҙ'\t' == '\\t'жқҘжҜ”иҫғе®ғ们жҳҜеҗҰзӣёзӯүгҖӮиҜ·жіЁж„ҸпјҢиҝҷжҳҜдёҖжқЎзҝ»иҜ‘иҜ·жұӮпјҢдёҚеҢ…жӢ¬е…¶д»–д»»дҪ•еҶ…е®№гҖӮ - falsetru
1
@MarekJedlińsk,您所说的是字符串传递到正则表达式本身后发生的情况,但是linter讨论的是字符串本身,在任何上下文中。 - Cornelius Roemer

5

Python 无法将 '\d' 解析为转义序列,这就是它产生警告的原因。

之后,它被传递给正则表达式解析器,字面上能够很好地作为正则表达式匹配元素使用。


这个答案对我帮助很大!我们在讨论两种不同的转义序列:1)Python字符串和2)正则表达式。来到这个问题的人会知道第二个意思,但不是第一个。但是linter抱怨第一个。 Linter试图检查您是否真的想让那个“d”成为“d”,还是它被误输入了。为了保险起见,它假设如果\有意义,则始终是双重转义。这样,任何真正的错误都会被注意到。 - Cornelius Roemer

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