find()找不到返回-1,index()抛ValueError异常;二者均不支持正则和重叠匹配,参数start/end中end为不包含的右边界,性能差异可忽略。
这是最常踩的坑:两者都用于查找子串,但 find() 找不到返回 -1,而 index() 直接抛出 ValueError 异常。如果你没做异常处理,用 index() 就可能让程序中断。
适用场景决定选哪个:
find()
index()
index() 直接裸调find() 和 index() 都只做朴素字符串匹配,不识别正则语法。传入 r"\d+" 或 "a*" 不会按正则解释,而是当作字面量去搜。
另外,它们默认从左到右找第一个非重叠匹配。例如在 "aaaa" 中找 "aa","aa".find("aa") 返回 0,第二次调用得手动偏移起始位置才能找到下一个:
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() 或手写循环。
两者都支持三个参数: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() 更语义化地切分。