regex - 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/上的一个示例, 该代码在他们的在线解释器中也可以正常工作。
复合语句中出现而简单语句中没有出现的语法错误究竟是什么?……为什么?谢谢你的帮助。
解决方案
像所有提供代码的提问者一样,您应该阅读如何创建一个最小但完整的可重现示例。特别是,它说要去掉所有对问题不重要的东西,因此会分散注意力。在这种情况下,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)指出我的代码错误之后重写上面的所有内容。
推荐阅读
- java - 如何让 API 在 Android 中返回整数列表?
- python - fnmatch.fnmatch 是否与 Unix 模式文件匹配语法不兼容?
- rundeck - 如何使用 Rundeck API 将文件传递给 Rundeck 作业?
- docker - GitLab CI:如何连接到 .gitlab-ci.yml 脚本中启动的 docker 容器?
- excel - 在度量中使用 LOOKUPVALUE 函数的替代方法?
- python - 使用 TensorFlow 进行预测缺失参数
- python - Groupby在python中使用循环
- git - 如何一般只获取当前分支
- php - Laravel 6 - 密码确认
- java - 自定义类型的 PCollection 汇总的管道性能 - 属性的平均值和中值