Python find()函数返回意外结果的原因解析
Python str.find() 查找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|"
调用find()查找目标子串时,结果不符合预期:
print(string.find('DLR')) # 输出:0 print(string.find('DLR1')) # 输出:0 print(string.find('DLR2')) # 输出:19
但如果查找带等号的完整键名,就能得到预期的三个不同索引:
print(string.find('DLR=')) # 输出:38 print(string.find('DLR1=')) # 输出:0 print(string.find('DLR2=')) # 输出:19
原因解析 & 是否为预期行为
这绝对是str.find()的预期行为,核心逻辑很简单:find()方法会返回子串在字符串中第一次出现的起始索引:
- 找
DLR时,字符串最开头(索引0)的前3个字符就是DLR(对应string[0:3]),所以直接返回0; - 找
DLR1时,字符串最开头的前4个字符是DLR1(对应string[0:4]),它的起始位置也是0,因此同样返回0; - 找
DLR2时,开头没有匹配的子串,直到索引19的位置才找到第一个DLR2,所以返回19。
而带等号的子串之所以能得到正确结果,是因为:
DLR=不会在开头匹配(开头是DLR1=),只有到索引38的位置才出现独立的DLR=;DLR1=和DLR2=各自的起始位置唯一,不会和其他子串重叠匹配,因此返回正确的索引。
内容的提问来源于stack exchange,提问作者Francesco Gregotti
相关产品推荐
相关产品推荐

