首页 > 解决方案 > IDLE 中的正则表达式语法错误,但在我的 Python 程序中却没有?

问题描述

多年来,我一直受益于 stackoverflow 社区的知识。终于发现一个问题,我不知道怎么查。。。

我在 Windows 10 上使用 Python IDLE Shell 3.9.5。这是我输入的内容。

import re
txt="That will be 59 dollars"
x = re.findall("\d", txt)
x
['5', '9']

这正是人们所期望的。

现在试试这个:

if True : x = re.findall("\d", txt)
SyntaxError: invalid escape sequence \d

由于语法错误,该行代码未执行。该行中的第一个双引号由 Shell 突出显示。

在我的工作代码中,'if True :' 表达式当然是一个更有用的条件表达式。我已经简化了它来说明这个问题。

如果此代码是从命令行运行的 Python 脚本,或者如果脚本在 IDLE Shell 中打开并运行,则不会出现语法错误。

顺便说一句,对于那些好奇的人,'txt' 行来自https://www.w3schools.com/上的一个示例, 该代码在他们的在线解释器中也可以正常工作。

复合语句中出现而简单语句中没有出现的语法错误究竟是什么?……为什么?谢谢你的帮助。

标签: regexsyntaxpython-idle

解决方案


像所有提供代码的提问者一样,您应该阅读如何创建一个最小但完整的可重现示例。特别是,它说要去掉所有对问题不重要的东西,因此会分散注意力。在这种情况下,re 模块是无关紧要的。这是在交互式 3.9.7 中运行的最小代码:

>>> '\d'
<stdin>:1: DeprecationWarning: invalid escape sequence \d
'\\d'
>>> if True: '\d'
<stdin>:1: DeprecationWarning: invalid escape sequence \d
...
'\\d'

该警告意味着将来,无效的转义序列 '\d' 将成为语法错误(在 3.11 或更高版本中)。警告从 3.9 开始,并在 3.10 中继续。

这是 3.9.7 IDLE 中的相同示例。

>>> '\d'
'\\d'
>>> if True: '\d'
SyntaxError: invalid escape sequence '\d'

当前未打印弃用警告。但是为什么会出现过早的 SyntaxError 呢?IDLE 使用 code.InteractiveInterpreter 并使用其 .runsource 方法运行 shell 输入。这反过来又使用了 codeop,它使用内置的 compile() 和一些额外的技巧。所以我尝试了:

>>> import code
>>> ii = code.InteractiveInterpreter()
>>> ii.runsource("'\d'")
'\\d'
False
>>> ii.runsource("if 1:'\d'")
  File "<input>", line 1
    if 1:'\d'
         ^
SyntaxError: invalid escape sequence '\d'
False
>>> 

'False' 是runsource 的返回值,这意味着语句已经完成,不需要更多的输入行。IDLE 在内部调用 runsource 时不打印返回值。

该错误表明您和 IDLE 都没有做错任何事情。codeop 或 compile() 中某处有错误。我将在跟踪器上打开一个问题。感谢您报告此异常。

编辑:Wiktor [见评论] 是正确的,一种直接的解决方案是使用 'r' 前缀。最终将需要那个或加倍的'\'。

import code编辑2:在你(D Davis)指出我的代码错误之后重写上面的所有内容。


推荐阅读