鱼C论坛

 找回密码
 立即注册
查看: 1087|回复: 2

[已解决]正则表达式问题

[复制链接]
发表于 2023-8-21 22:31:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import re
a = re.search(r".*\.(?!(bat)$|exe$).*", "as.batfs")
print(a)

为什么此段代码打印的结果是as.batfs


import re
a = re.search(r".*\.(?!(bat)|exe$).*", "as.batfs")
print(a)
而此段代码打印的结果是None
最佳答案
2023-8-21 22:32:15
关于正则表达式的代码结果

第一段代码的结果是 as.batfs,而第二段代码的结果是 None

让我们逐行分析这两段代码以及它们的正则表达式:

第一段代码:
  1. import re
  2. a = re.search(r".*\.(?!(bat)$|exe$).*", "as.batfs")
  3. print(a)
复制代码

在这段代码中,使用了正则表达式 .*\.(?!(bat)$|exe$).* 来搜索匹配。我们来解释这个正则表达式的含义:

- .*:匹配任意字符(除换行符)0次或多次。
- \.:匹配一个点号(因为点号在正则表达式中有特殊含义,所以需要用反斜杠进行转义)。
- (?!(bat)$|exe$):使用负向前瞻零宽断言,表示从当前位置开始,后面不应该出现 batexe 结尾的内容。
- .*:继续匹配任意字符(除换行符)0次或多次。

因此,对于输入字符串 "as.batfs",正则表达式会从头开始匹配,由于 .* 可以匹配到整个字符串,而 (?!(bat)$|exe$) 的负向前瞻断言也满足条件,所以匹配成功,返回匹配结果 as.batfs

第二段代码:
  1. import re
  2. a = re.search(r".*\.(?!(bat)|exe$).*", "as.batfs")
  3. print(a)
复制代码

在这段代码中,正则表达式为 .*\.(?!(bat)|exe$).*。注意到,在负向前瞻断言的部分,我们去掉了 $ 符号,即 (?!bat) 而不是 (bat)$

这个修改的含义是,我们希望字符串的结尾可以是 bat,但是此时正则表达式会匹配失败,因为后面跟着的 .fs 不满足条件。因此,整个正则表达式无法匹配成功,所以返回结果是 None

希望以上解释能够帮助你理解这两段代码的结果。如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-21 22:32:15 | 显示全部楼层    本楼为最佳答案   
关于正则表达式的代码结果

第一段代码的结果是 as.batfs,而第二段代码的结果是 None

让我们逐行分析这两段代码以及它们的正则表达式:

第一段代码:
  1. import re
  2. a = re.search(r".*\.(?!(bat)$|exe$).*", "as.batfs")
  3. print(a)
复制代码

在这段代码中,使用了正则表达式 .*\.(?!(bat)$|exe$).* 来搜索匹配。我们来解释这个正则表达式的含义:

- .*:匹配任意字符(除换行符)0次或多次。
- \.:匹配一个点号(因为点号在正则表达式中有特殊含义,所以需要用反斜杠进行转义)。
- (?!(bat)$|exe$):使用负向前瞻零宽断言,表示从当前位置开始,后面不应该出现 batexe 结尾的内容。
- .*:继续匹配任意字符(除换行符)0次或多次。

因此,对于输入字符串 "as.batfs",正则表达式会从头开始匹配,由于 .* 可以匹配到整个字符串,而 (?!(bat)$|exe$) 的负向前瞻断言也满足条件,所以匹配成功,返回匹配结果 as.batfs

第二段代码:
  1. import re
  2. a = re.search(r".*\.(?!(bat)|exe$).*", "as.batfs")
  3. print(a)
复制代码

在这段代码中,正则表达式为 .*\.(?!(bat)|exe$).*。注意到,在负向前瞻断言的部分,我们去掉了 $ 符号,即 (?!bat) 而不是 (bat)$

这个修改的含义是,我们希望字符串的结尾可以是 bat,但是此时正则表达式会匹配失败,因为后面跟着的 .fs 不满足条件。因此,整个正则表达式无法匹配成功,所以返回结果是 None

希望以上解释能够帮助你理解这两段代码的结果。如果还有其他问题,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-21 22:32:31 | 显示全部楼层
第一个代码段的正则表达式是 .*\.(?!(bat)$|exe$).* ,它的含义是匹配任意字符0次或多次,后面跟着一个点(.),然后是一个不以"bat"或"exe"结尾的字符串,最后再匹配任意字符0次或多次。

在第一个代码段中,字符串"as.batfs"匹配了正则表达式。首先, .* 匹配了"as",然后 \. 匹配了一个点,接着 (?!(bat)$|exe$) 表示后面不能是以"bat"或"exe"结尾的字符串,因此"fs"不会被匹配,最后 .* 匹配了"fs"。因此,整个字符串被匹配成功,所以打印的结果是"as.batfs"。

第二个代码段的正则表达式是 .*\.(?!(bat)|exe$).* ,它的含义与第一个代码段类似,只是括号的位置发生了变化。

在第二个代码段中,字符串"as.batfs"不匹配正则表达式。首先, .* 匹配了"as",然后 \. 匹配了一个点,接着 (?!(bat)|exe$) 表示后面不能是以"bat"或"exe"结尾的字符串,但是"fs"以"bat"结尾,所以整个字符串不符合正则表达式的要求,因此打印的结果是None。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 13:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表