Python,Eclipse中正则表达式字符串的pep8警告

Posted

技术标签:

【中文标题】Python,Eclipse中正则表达式字符串的pep8警告【英文标题】:pep8 warning on regex string in Python, Eclipse 【发布时间】:2013-10-02 13:57:43 【问题描述】:

为什么 pep8 抱怨代码中的下一个字符串?

import re
re.compile("\d3")

我收到的警告:

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

你能解释一下消息的含义吗?我需要在代码中进行哪些更改才能通过警告 W1401

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

【问题讨论】:

【参考方案1】:

"\d""\\d" 相同,因为d 没有转义序列。但是代码的读者并不清楚。

但是,请考虑\t"\t" 代表制表符,r"\t" 代表文字 \t 字符。

所以当你的意思是文字 \d 时使用原始字符串:

re.compile(r"\d3")

或显式转义反斜杠:

re.compile("\\d3")

【讨论】:

谢谢,我不知道前缀“r”及其功能。 来晚了,但\d\\d 完全不同。前者匹配任何(Unicode)数字;后者匹配反斜杠,后跟d。它们不是等价的。 Pylint 似乎在这里错了。 @moodforaday,在 python 交互式 shell 中尝试'\d' == '\\d'。还有'\t' == '\\t' @MarekJedlińsk 您说的是一旦将字符串传递给正则表达式本身会发生什么,但 linter 在任何情况下都在谈论字符串本身。【参考方案2】:

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

之后,它按字面意思传递给正则表达式解析器,作为 E.S. 可以正常工作。用于正则表达式。

【讨论】:

这个答案对我帮助很大!我们在这里讨论两种不同的转义序列:1)用于 Python 字符串和 2)用于正则表达式。来到这个问题的人会意识到第二个含义,但不是第一个含义。但第一个是 linter 抱怨的。 linter 正在尝试检查您是否真的打算将 d 设置为 d 或者它是否没有输入错误。为了安全起见,它假定 `` 总是被双重转义。这样,任何真正的错误都会被注意到。

以上是关于Python,Eclipse中正则表达式字符串的pep8警告的主要内容,如果未能解决你的问题,请参考以下文章

python正则表达式中的转义问题

python3--正则表达式

Python基础 :正则表达式

python中的正则表达式

正则表达式使用 Python 从 HTML 中的 href 属性中提取 URL [重复]

Python学习手册之正则表达式示例--邮箱地址提取