字符串切片索引从0开始,负数从末尾倒数;采用左闭右开区间;切片返回新字符串对象;步长为负时方向反转且起始结束逻辑互换;切片影响正则匹配的绝对位置。

字符串切片的索引从哪开始算?
Python 字符串切片用的是「左闭右开」区间,索引从 0 开始,负数从末尾倒着数(-1 是最后一个字符)。这不是约定俗成,是语言定义——越界不会报错,但取不到值就返回空字符串。
-
s[2:5] 取第 3 到第 5 个字符(含 2,不含 5)
-
s[-3:] 取最后三个字符,s[:-1] 去掉最后一个
-
s[10:1] 这种起始大于结束的写法,结果是空字符串 '',不是报错
s[2:5] 取第 3 到第 5 个字符(含 2,不含 5)s[-3:] 取最后三个字符,s[:-1] 去掉最后一个s[10:1] 这种起始大于结束的写法,结果是空字符串 '',不是报错常见错误:以为 s[1:3] 包含 3 个字符,其实只取 2 个;或误用 s[0:-0] 想取全部,结果是空——因为 -0 就是 0,s[0:0] 是空区间。
步长(step)为负时怎么理解截取方向?
步长 step 控制遍历方向和间隔。正步长从左往右跳,负步长从右往左跳,且此时起始和结束位置逻辑要反过来理解。
-
s[::-1] 是最常用反转写法,等价于从末尾到开头、每次退 1
-
s[5:1:-1] 表示从索引 5 开始(含),到索引 1 结束(不含),向左走,所以取的是 s[5], s[4], s[3], s[2]
-
s[:1:-1] 省略起始,表示“从末尾开始,到索引 1 前停止”,即不包含 s[1] 和 s[0]
s[::-1] 是最常用反转写法,等价于从末尾到开头、每次退 1s[5:1:-1] 表示从索引 5 开始(含),到索引 1 结束(不含),向左走,所以取的是 s[5], s[4], s[3], s[2]
s[:1:-1] 省略起始,表示“从末尾开始,到索引 1 前停止”,即不包含 s[1] 和 s[0]
容易踩的坑:
-
s[1:5:-1]这种起始小于结束却用负步长,结果为空——方向和区间矛盾,直接跳过 - 步长为
0会触发ValueError: slice step cannot be zero
切片结果是新字符串还是原字符串引用?
切片总是返回新字符串对象,原字符串不可变,这点和 list 不同(list 切片也新建,但可变对象行为易混淆)。
-
s = "hello",执行 t = s[1:3] 后,t 和 s 内存地址不同,修改 t 不影响 s
- 性能上:短字符串切片开销小;但对超长字符串(如 MB 级日志内容)反复切片,可能引发内存拷贝压力,此时应考虑用
memoryview 或流式处理
s = "hello",执行 t = s[1:3] 后,t 和 s 内存地址不同,修改 t 不影响 s
memoryview 或流式处理注意:Python 3.12+ 对某些常量字符串切片做了优化(如 "abcdef"[2:4]),但业务代码中不应依赖该行为,仍按「每次新建」来理解更稳妥。
在正则或格式化前先切片,会不会影响匹配结果?
会,而且影响很直接——切片改变原始文本长度和字符位置,所有基于绝对偏移的后续操作都会偏移。
- 用
re.search(r"world", s[6:]) 找到的 .start() 是相对于子串的,不是原字符串
- 如果你记录了切片后的匹配位置,又想映射回原文,得手动加偏移量:
orig_start = 6 + match.start()
re.search(r"world", s[6:]) 找到的 .start() 是相对于子串的,不是原字符串orig_start = 6 + match.start()
常见场景:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
- 日志行解析:先切掉时间戳部分
line[24:],再用正则提字段 - CSV 行清洗:用
line.strip()[1:-1]去首尾引号,但要注意空行或单引号情况
别忘了检查边界:如果 line 长度不足 24,line[24:] 不报错但返回空,后续正则可能误匹配空串。
切片看着简单,但索引方向、步长符号、边界隐式处理这三块,只要有一处没对齐上下文,结果就悄无声息地错了。

















