Python 字符串切片

Python 字符串切片语法

在 Python 中,字符串也可以像列表那样,使用 “切片” 的方式来截取其中的一部分。

语法:

str[m:n:step]

说明:

其中,m 是开始下标,n 是结束下标,step 是步长(默认值为 1)。很多情况下情况下,step 都是缺省(即采用默认值 1)。

m 和 n 可以是正数,也可以是负数,不过 n 一定要大于 m。list[m:n] 的截取范围为 [m, n),也就是包含 m 不包含 n。其中 m 和 n 都可以省略。

  • 当 n 省略时,获取的范围为:m 到结尾位置
  • 当 m 省略时,获取的范围为:开头位置到 n
  • 当 m 和 n 同时省略,获取范围为:整个列表

提示: 列表也有切片的语法,另请参阅:Python 列表切片

Python 字符串切片示例

接下来,我们通过几个简单的例子来讲解一下 Python 字符串切片是如何使用的。

示例 1:字符串正向切片

s = 'classroom'
print(s[2:5])

运行结果如下。

ass

分析:

s[2:5] 表示切片截取的范围为 [2, 5),也就是包含 2 但不包含 5(如下图所示)。一定要注意,截取的下标是从 0 开始的,也就是说 0 表示第 1 个字符,1 表示第 2 个字符,依此类推。实际上,在字符串的各种操作中,凡是涉及下标的,都是从 0 开始,这一点和列表的下标是一样的。

Python 字符串切片示例 -1

注意: 对于 str[m:n] 而言,切片取出的最后一个元素不是 str[n],而是 str[n] 的前一个元素,也就是 str[n-1]。

示例 2:字符串反向切片

s = 'classroom'
print(s[-7: -4])

运行结果如下。

ass

分析:

对于上面的示例,具体分析如下图所示。

Python 字符串切片示例 -2

示例 3:str[m:]

s = 'classroom'
print(s[5:])
print(s[-4:])

运行结果如下。

room
room

分析:

对于上面的示例,具体分析如下图所示。

Python 字符串切片示例 -3

示例 4:str[:n]

s = 'classroom'
print(s[:5])
print(s[:-4])

运行结果如下。

class
class

分析:

对于上面的示例,具体分析如下图所示。

Python 字符串切片示例 -4

示例 5:str[:]

s = 'classroom'
print(s[:])
print(s[:] == s)

运行结果如下。

classroom
True

提示: 与列表一样,str[:] 这种切片方式可以用于复制一个字符串,这是一个很实用的技巧。

示例 6:str[m:n] 中的 n 超出范围

s = 'classroom'
print(s[5:6])
print(s[5:7])
print(s[5:8])
print(s[5:9])
print(s[5:])

运行结果如下。

r
ro
roo
room
room

分析:

从上面的示例可以看出,当 str[m:n] 中的 n 超出范围时,运行结果跟 str[m:] 一样,获取的范围都是 m 到结尾位置。

示例 7:带有步长的字符串切片

s = 'classroom'

# 步长为 2
print(s[0:5:2])

# 步长为 -1
print(s[::-1])

运行结果如下。

car
moorssalc

分析:

s[0:5:2] 的步长为 2,表示每隔一个字符取一个,所以结果是 car。

而 s[::-1] 是 Python 开发中极具特色的一种写法,省略了开始和结束位置,并将步长设为负数,从而巧妙地实现了字符串的倒序输出。

为什么 Python 提供多种切片语法?

到这里,小伙伴可能就会问了:“Python 提供 str[m:n] 这一种切片方式不就够了吗?为什么还要搞出 str[m:]、str[:n]、str[-m:-n] 那么多方式呢?” 想要知道为什么,我们还是先来看一个例子:

s = 'Hello Java C# PHP Ruby Python'

对于上面这一句代码,如果想要截取 “Python”,单纯使用正数下标就非常麻烦了,因为需要从左到右一个个地数字符的个数。但使用负数下标(str[-m:-n]),就简单多了。再者,如果想要截取 “Java C# PHP Ruby Python”,单纯使用正数下标也非常麻烦,而使用 str[m:] 的方式却非常简单。

之所以 Python 提供多种切片语法,其实也是为了满足各种开发需求以及提高开发效率。

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号