为什么Python正则\d在IDLE单行复合语句报错其余场景运行正常?
错误触发的根本原因
该问题是Python 3.9及更早版本IDLE REPL的解析逻辑bug,仅在单行输入复合语句时触发,具体原理如下:
- Python原生语法规则中,
\d不属于字符串默认支持的转义序列(仅\n、\t这类属于合法转义序列),标准解释器只会对这类非合法转义序列抛出弃用警告,不会判定为语法错误,代码可以正常运行,正则语义由re模块自行解析。 - IDLE普通单行代码的解析逻辑和标准Python解释器完全一致,所以单独输入
x = re.findall("\d", txt)可以正常执行。 - 当你输入带冒号的单行复合语句(比如
if True: x = re.findall("\d", txt))时,3.9及更早版本的IDLE会在把代码提交给Python解释器之前,额外做一次字符串转义预校验,这部分校验逻辑存在设计缺陷,错误的把所有非合法转义序列直接判定为语法错误,所以会抛出你看到的报错。 - 脚本运行、在线解释器等场景不会触发IDLE的这层额外预校验,所以运行完全正常。
规避方案
- 方案1:正则表达式统一使用原生字符串,添加前缀
r即可:if True: x = re.findall(r"\d", txt),原生字符串不会触发转义校验,所有场景都能正常运行。 - 方案2:升级到Python 3.10及以上版本,该IDLE解析bug已经在后续版本中修复。
内容的提问来源于stack exchange,提问作者D Davis
相关产品推荐
相关产品推荐

