切片最直观高效,适合按位置截取;find()配合切片适用于分隔符定位;正则仅用于复杂模式匹配。三者职责分明:切片管位置,find()管定位,正则管模式。

python 截取字符串,优先用切片([start:end:step]),它最直观、最快、也最常用;find() 和正则适合有明确定位逻辑或模式匹配的场景,不是拿来替代切片的。
切片是最直接的截取方式,但起止索引容易错
切片本质是按位置取子串,不关心内容。常见错误是混淆 end 是“到哪为止”(不包含),不是“取几个字符”。
-
s = "hello world",s[0:5]得"hello",s[6:11]得"world",s[6:]从第 6 位取到末尾 - 负索引可用:
s[-5:]取最后 5 个字符 →"world";s[:-6]去掉末尾 6 个 →"hello" - 越界安全:即使
end超出长度,也不会报错,自动截断到末尾 - 别用切片找内容——比如想“取冒号后面的部分”,硬写
s[s.find(':')+1:]就是把切片和find()混用了,该用find()的地方就该让它干这事
用 find() / rfind() 定位分隔符再切片,比纯正则更轻量
当你知道分隔符(如 '-'、'@'、':'),但不确定它在哪儿时,find() 返回索引,配合切片才是标准解法。
-
s = "user@example.com",at_pos = s.find('@')→4,s[at_pos+1:]得"example.com" - 找不到返回
-1,直接切片会出错:s[-1+1:] == s[0:],结果不对;务必先判断:if at_pos != -1: ... - 要取最后一处(如文件扩展名)用
rfind():"a.b.c.txt".rfind('.') → 7,s[8:] → "txt" - 多个分隔符?
split()更合适,find()只适合取第一/最后一个关键位置
正则用于复杂模式截取,但小题大做反而难维护
正则真正必要的情况是:要同时满足多个条件(如“数字开头 + 含下划线 + 结尾是三位字母”),或结构不固定(如日志中提取 IP + 时间 + 状态码)。
立即学习“Python免费学习笔记(深入)”;
- 简单需求别上正则:
re.search(r'_(w+)_', s)提取中间单词,看似短,但比s.split('_')[1]多依赖、难读、难调 - 捕获组是核心:
match = re.search(r'ID:(d+)', line),用match.group(1)拿数字,别忘了判空 -
re.findall()适合提取所有匹配项;re.sub()是替换,不是截取——别误用 - 性能敏感场景慎用:正则编译、匹配开销远高于
find()或切片,尤其在循环里反复用未编译的 pattern
切片管位置,find() 管定位,正则管模式——三者边界其实很清晰。很多人一上来就想“用正则一行解决”,结果连 s.rpartition('.')[-1] 这种更稳妥取后缀的方式都忽略了。