davidmou 发表于 2023-8-21 22:31:58

正则表达式问题

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

学习编程中的Ben 发表于 2023-8-21 22:32:15

关于正则表达式的代码结果

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

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

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


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

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

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

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


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

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

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

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 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。
页: [1]
查看完整版本: 正则表达式问题