Pyhton find() 函数的意外结果

Unexpected results from Pyhton find() function

提问人:Francesco Gregotti 提问时间:11/8/2023 最后编辑:Francesco Gregotti 更新时间:11/8/2023 访问量:65

问:

我有这个字符串

string = "DLR1=A,B,C,D,E,F,G|DLR2=A,B,C,D,E,F,G|DLR=A,B,C,D,E,F,G|"

我想找到 DLRDLR1DLR2 的索引。

但是,当我使用 Python find() 函数时,我没有像预期的那样获得 3 个不同的索引。

据我了解,该函数查找我的子字符串(DLR、DLR1、DLR2)的第一个出现项并返回索引。

如果这是真的,我不明白为什么 DLR 和 DLR1 具有相同的起始索引,而 DLR2 具有不同的起始索引。

我试过什么

运行此代码时:

string = "DLR1=A,B,C,D,E,F,G|DLR2=A,B,C,D,E,F,G|DLR=A,B,C,D,E,F,G|"

print(string.find('DLR'))

print(string.find('DLR1'))

print(string.find('DLR2'))

输出:

0
0
19

我发现这输出了预期的结果:

print(string.find('DLR='))

print(string.find('DLR1='))

print(string.find('DLR2='))

输出:

38
0
19

我的问题是为什么会发生这种情况,这是意料之中的吗?

编辑:

@slothrop给出了一个很好的解释

string[0:3] 是 'DLR',string[0:4] 是 'DLR1'。所以 string.find('DLR') 和 string.find('DLR1')' 都给出 0。但是没有 n,因此 string[0:n] 是 'DLR2',所以 string.find('DLR2') 不能是 0

python 字符串 查找

评论

4赞 Sayse 11/8/2023
因为 DLR 和 DLR1 的第一次出现是一样的?
0赞 slothrop 11/8/2023
您是否期望这会忽略字符串以 ?string.find('DLR')DLR
1赞 slothrop 11/8/2023
string[0:3]是 ,并且是 。所以两个 string.find('DLR1')' 都给出 0。但是没有这样的 ,所以不能是 0。'DLR'string[0:4]'DLR1'string.find('DLR') and nstring[0:n]'DLR2'string.find('DLR2')
2赞 slothrop 11/8/2023
@FrancescoGregotti它不是在搜索单词本身:它只是在搜索字符序列。
1赞 Francesco Gregotti 11/8/2023
@slothrop哦,我明白了。所以这就是为什么当我添加 = 时,它会返回不同的索引。

答:

0赞 HoliSimo 11/8/2023 #1

因为“DLR”是“DLR1”的子字符串。在此方案中,DLR1 是第一个出现的,因此查找操作将为“DLR1”和“DLR”返回 0。“DLR”在本文中出现了三次!

您应该尝试找到以下字符串:“DLR=”、“DLR1=”、“DLR2=”,它应该可以工作!

1赞 Karine Bauch 11/8/2023 #2

str.find() 有什么作用

find() 方法查找指定值的第一个匹配项,如果未找到该值,则返回 -1。

str.find() 文档

返回字符串中子字符串 sub 位于切片 s[start:end] 中的最低索引。可选参数 start 和 end 被解释为切片表示法。如果未找到 sub,则返回 -1。

在第一个代码段中:

  • DLR位于索引 0 处(因为它是DLR1)
  • DLR1也处于索引 0
  • DLR2在索引 19

在第二个代码段中:

  • DLR=在索引 38
  • DLR1=在索引 0 处
  • DLR2=在索引 19