一、什么是字符串切片?
字符串切片(Slicing) 是 Python 中用于从字符串中提取子串的操作。通过指定起始和结束位置(以及可选的步长),可以灵活地获取字符串的任意部分。切片操作返回一个新的字符串,原字符串不变。
text = "Hello Python"
sub = text[0:5] # 从索引0到4(不包含5)
print(sub) # Hello
二、切片语法
字符串[起始:结束:步长]
- • 结束:切片结束的索引(不包含),默认为字符串长度。
三个参数都是可选的,但冒号必须保留以表示切片操作。
三、基本切片示例
3.1 提取连续子串
text = "Python Programming"
# 提取前6个字符
print(text[0:6]) # Python
# 从索引7到18(不包含18)
print(text[7:18]) # Programming
# 从开头到索引6
print(text[:6]) # Python
# 从索引7到结尾
print(text[7:]) # Programming
# 提取整个字符串(浅拷贝)
print(text[:]) # Python Programming
规则:
3.2 负数索引切片
负数索引从 -1 开始,表示从右往左数。
text = "Python"
# 提取最后两个字符
print(text[-2:]) # on
# 提取从倒数第4个到倒数第2个(不包含倒数第2)
print(text[-4:-1]) # thon
# 从开头到倒数第3个
print(text[:-3]) # Pyt
注意: 负数索引与正数索引混合使用也很方便,只要逻辑正确即可。
四、带步长的切片
步长决定取字符的间隔。
4.1 正步长(从左到右)
text = "Python"
# 步长为2,每隔一个取一个
print(text[::2]) # Pto
# 从索引1到5,步长为2
print(text[1:5:2]) # yh
4.2 负步长(从右到左)
负步长意味着反向遍历,此时 起始 应该大于 结束 才能取到值。
text = "Python"
# 反转字符串
print(text[::-1]) # nohtyP
# 从索引5到1,步长为-1(反向)
print(text[5:1:-1]) # noht
# 从末尾到开头,每隔2个取一个
print(text[::-2]) # nhy
规则:
- • 当步长为正时,
起始 必须小于 结束 才能取到非空切片。 - • 当步长为负时,
起始 必须大于 结束 才能取到非空切片。 - • 省略
起始 和 结束 时,正步长默认从开头到结尾,负步长默认从结尾到开头。
五、切片操作的返回值
切片总是返回一个新的字符串,原字符串不变(字符串不可变)。
s = "hello"
s2 = s[1:4]
print(s2) # ell
print(s) # hello(原字符串未变)
六、常见错误与注意事项
6.1 索引越界
切片操作不会引发索引越界错误,它会自动处理边界,返回可用的部分。
s = "abc"
print(s[1:10]) # bc(不会报错)
print(s[10:]) # 空字符串
6.2 起始大于结束且步长为正
如果步长为正但 起始 >= 结束,得到空字符串。
s = "abc"
print(s[3:1]) # 空字符串
6.3 起始小于结束且步长为负
如果步长为负但 起始 <= 结束,得到空字符串。
s = "abc"
print(s[1:3:-1]) # 空字符串
6.4 省略参数的默认值
- • 省略
起始:默认 0(步长为正时)或 -1(步长为负时) - • 省略
结束:默认字符串长度(步长为正时)或 负长度-1(步长为负时)
s = "hello"
print(s[:]) # 等价于 s[0:5:1]
print(s[::-1]) # 等价于 s[-1:-6:-1](-6 是超出范围,但自动处理)
6.5 步长不能为 0
# s[::0] # ValueError: slice step cannot be zero
七、实用案例
案例1:反转字符串
defreverse_string(s):
return s[::-1]
print(reverse_string("Python")) # nohtyP
案例2:检查回文
defis_palindrome(s):
return s == s[::-1]
print(is_palindrome("radar")) # True
print(is_palindrome("hello")) # False
案例3:提取文件扩展名
filename = "document.pdf"
ext = filename[-3:] if'.'in filename else""
print(ext) # pdf
案例4:每隔一个字符取一个
text = "abcdefg"
every_second = text[::2]
print(every_second) # aceg
案例5:去除字符串首尾的指定字符(模拟 strip)
defcustom_strip(s, chars):
# 去掉开头匹配的字符
start = 0
while start < len(s) and s[start] in chars:
start += 1
# 去掉结尾匹配的字符
end = len(s)
while end > start and s[end-1] in chars:
end -= 1
return s[start:end]
print(custom_strip("...hello...", ".")) # hello
案例6:获取字符串的前半部分和后半部分
s = "PythonProgramming"
mid = len(s) // 2
first_half = s[:mid]
second_half = s[mid:]
print(first_half) # PythonPr
print(second_half) # ogramming
案例7:每两个字符一组
s = "abcdef"
pairs = [s[i:i+2] for i inrange(0, len(s), 2)]
print(pairs) # ['ab', 'cd', 'ef']
八、总结
- • 基本语法:
[起始:结束:步长],三个参数都可省略。
掌握切片,能让你在处理字符串时更加得心应手。