当前位置:首页>python>Python字符串切片——灵活截取子串

Python字符串切片——灵活截取子串

  • 2026-10-05 12:15:19
Python字符串切片——灵活截取子串

一、什么是字符串切片?

字符串切片(Slicing) 是 Python 中用于从字符串中提取子串的操作。通过指定起始和结束位置(以及可选的步长),可以灵活地获取字符串的任意部分。切片操作返回一个新的字符串,原字符串不变。

text = "Hello Python"
sub = text[0:5]   # 从索引0到4(不包含5)
print(sub)        # Hello

二、切片语法

字符串[起始:结束:步长]
  • • 起始:切片开始的索引(包含),默认为 0。
  • • 结束:切片结束的索引(不包含),默认为字符串长度。
  • • 步长:每隔多少个字符取一个,默认为 1。

三个参数都是可选的,但冒号必须保留以表示切片操作。


三、基本切片示例

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(步长为负时)
  • • 省略 步长:默认 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']

八、总结

  • • 字符串切片 是从字符串中提取子串的灵活方式。
  • • 基本语法:[起始:结束:步长],三个参数都可省略。
  • • 包含起始,不包含结束。
  • • 支持负数索引,从 -1 开始。
  • • 步长可以为负,实现反向切片。
  • • 切片越界不会引发错误,而是返回可用的部分。
  • • 切片返回新字符串,原字符串不变。
  • • 常用于反转、截取、遍历、数据提取等场景。

掌握切片,能让你在处理字符串时更加得心应手。

最新文章

随机文章