find()找不到返回-1,index()抛ValueError异常;二者均不支持正则和重叠匹配,参数start/end中end为不包含的右边界,性能差异可忽略。

find() 和 index() 都找不到时行为完全不同
这是最常踩的坑:两者都用于查找子串,但 find() 找不到返回 -1,而 index() 直接抛出 ValueError 异常。如果你没做异常处理,用 index() 就可能让程序中断。
适用场景决定选哪个:
- 需要安全判断是否存在(比如条件分支)→ 用
find() - 你确定子串一定存在,且想靠异常快速失败 → 用
index() - 写日志、配置解析等容错要求高的地方 → 别用
index()直接裸调
它们都不支持正则,也都不支持重叠匹配
find() 和 index() 都只做朴素字符串匹配,不识别正则语法。传入 r"\d+" 或 "a*" 不会按正则解释,而是当作字面量去搜。
另外,它们默认从左到右找第一个非重叠匹配。例如在 "aaaa" 中找 "aa","aa".find("aa") 返回 0,第二次调用得手动偏移起始位置才能找到下一个:
立即学习“Python免费学习笔记(深入)”;
text = "aaaa"
pos = text.find("aa")
while pos != -1:
print(f"found at {pos}")
pos = text.find("aa", pos + 1) # 注意是 pos + 1,不是 pos + 2如果要重叠匹配或正则能力,得换 re.finditer() 或手写循环。
参数完全一致,但 start/end 的边界行为容易误判
两者都支持三个参数:str.find(sub[, start[, end]]),其中 end 是**不包含**的右边界(类似切片),不是长度也不是“最多查几个字符”。
常见错误写法:
-
s.find("x", 0, 5)查的是s[0:5],即前 5 个字符(索引 0~4) -
s.find("x", len(s)-3)想查末尾 3 个字符?其实查的是从倒数第 3 个开始到结尾 —— 如果你想限定只在末尾 3 字符内找,必须写成s.find("x", len(s)-3, len(s)) -
start超出字符串长度 → 返回-1(find)或报错(index)
性能差异几乎可以忽略,别为它做预优化
在 CPython 实现中,find() 和 index() 底层共用同一套查找逻辑,差别只在找不到时的收尾处理。实测百万次查找,耗时差在纳秒级。
真正影响性能的是:
- 是否反复对同一长字符串调用(考虑提前编译成
bytes或用re.compile) - 是否在循环里重复计算
start和end(把len(s)提到循环外) - 是否误用
index()导致频繁异常捕获(异常开销远大于查找本身)
真有性能瓶颈时,先看是不是该用 in 判断存在性,或者改用 str.partition() / str.split() 更语义化地切分。










