Python字符串查找技巧_find与index区别详解【指导】

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,第二次调用得手动偏移起始位置才能找到下一个:

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 超出字符串长度 → 返回 -1find)或报错(index

性能差异几乎可以忽略,别为它做预优化

在 CPython 实现中,find()index() 底层共用同一套查找逻辑,差别只在找不到时的收尾处理。实测百万次查找,耗时差在纳秒级。

真正影响性能的是:

  • 是否反复对同一长字符串调用(考虑提前编译成 bytes 或用 re.compile
  • 是否在循环里重复计算 startend(把 len(s) 提到循环外)
  • 是否误用 index() 导致频繁异常捕获(异常开销远大于查找本身)

真有性能瓶颈时,先看是不是该用 in 判断存在性,或者改用 str.partition() / str.split() 更语义化地切分。