如何在Python3中对字符串进行索引和切片

来自菜鸟教程
跳转至:导航、​搜索

###介绍

Python 字符串数据类型是由一个或多个单个字符组成的序列,这些字符可以由字母、数字、空白字符或符号组成。 因为字符串是一个序列,所以可以通过索引和切片以与其他基于序列的数据类型相同的方式访问它。

本教程将指导您通过索引访问字符串,通过字符序列对它们进行切片,并介绍一些计数和字符定位方法。

先决条件

您应该在您的计算机或服务器上安装 Python 3 并设置编程环境。 如果您没有设置编程环境,您可以参考本地编程环境或服务器上的编程环境适合您的操作的安装和设置指南系统(Ubuntu、CentOS、Debian 等)

    1. 如何对字符串进行索引

列表数据类型 具有对应于索引号的项一样,字符串的每个字符也对应于一个索引号,从索引号 0 开始。

对于字符串 Sammy Shark!,索引分解如下:

S a m m y S h a r k !
0 1 2 3 4 5 6 7 8 9 10 11

如您所见,第一个 S 从索引 0 开始,字符串以 ! 符号在索引 11 结束。

我们还注意到 SammyShark 之间的空白字符也对应于它自己的索引号。 在这种情况下,与空白关联的索引号是 5。

感叹号 (!) 也有一个与之关联的索引号。 任何其他符号或标点符号,例如 *#$&.;?,也是一个字符,将与它自己的索引号相关联。

Python 字符串中的每个字符都有对应的索引号这一事实使我们能够以与其他顺序数据类型相同的方式访问和操作字符串。

    1. 按正索引号访问字符

通过引用索引号,我们可以隔离字符串中的一个字符。 我们通过将索引号放在方括号中来做到这一点。 让我们声明一个字符串,打印它,然后在方括号中调用索引号:

Info: 要跟随本教程中的示例代码,请通过运行 python3 命令在本地系统上打开 Python 交互式 shell。 然后,您可以通过在 >>> 提示符后添加示例来复制、粘贴或编辑示例。


ss = "Sammy Shark!"
print(ss[4])
Outputy

当我们引用字符串的特定索引号时,Python 会返回该位置的字符。 由于字母 y 位于字符串 ss = "Sammy Shark!" 的索引号 4 处,因此当我们打印 ss[4] 时,我们会收到 y 作为输出。

索引号允许我们访问字符串中的特定字符。

    1. 按负索引号访问字符

如果我们有一个很长的字符串,并且我们想精确定位一个项目的末尾,我们也可以从字符串的末尾倒数,从索引号 -1 开始。

对于相同的字符串 Sammy Shark!,负索引分解如下:

S a m m y S h a r k !
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

通过使用负索引号,我们可以打印出字符 r,通过引用它在 -3 索引处的位置,如下所示:

print(ss[-3])
Outputr

使用负索引号可能有利于在长字符串的末尾隔离单个字符。

    1. 切片字符串

我们还可以从字符串中调出一系列字符。 假设我们只想打印单词 Shark。 我们可以通过创建 slice 来做到这一点,它是原始字符串中的字符序列。 使用切片,我们可以通过创建以冒号 [x:y] 分隔的索引号范围来调用多个字符值:

print(ss[6:11])
OutputShark

在构造切片时,如 [6:11] 中,第一个索引号是切片开始的位置(包括),第二个索引号是切片结束的位置(不包括),这就是为什么在我们上面的示例中范围必须是字符串结束后出现的索引号。

在对字符串进行切片时,我们正在创建一个 子字符串 ,它本质上是一个存在于另一个字符串中的字符串。 当我们调用 ss[6:11] 时,我们正在调用字符串 Sammy Shark! 中存在的子字符串 Shark

如果我们想包含字符串的任一端,我们可以省略 string[n:n] 语法中的一个数字。 例如,如果我们想打印字符串 ss 的第一个单词——“Sammy”——我们可以通过键入:

print(ss[:5])
OutputSammy

我们通过在切片语法中省略冒号之前的索引号来做到这一点,而只包括冒号之后的索引号,它指的是子字符串的结尾。

要打印从字符串中间开始并打印到结尾的子字符串,我们可以通过在冒号前仅包含索引号来实现,如下所示:

print(ss[7:])
Outputhark!

通过仅在冒号前包含索引号并将第二个索引号排除在语法之外,子字符串将从调用的索引号的字符开始到字符串的末尾。

您还可以使用负索引号对字符串进行切片。 正如我们之前所经历的,字符串的负索引号从 -1 开始,然后从那里倒数直到到达字符串的开头。 当使用负索引号时,我们将首先从较低的数字开始,因为它出现在字符串的前面。

让我们使用两个负索引号对字符串 ss 进行切片:

print(ss[-4:-1])
Outputark

子字符串“ark”是从字符串“Sammy Shark!”中打印出来的。 因为字符“a”出现在-4索引号位置,而字符“k”出现在-1索引号位置之前。

    1. 在切片字符串时指定步幅

除了两个索引号之外,字符串切片还可以接受第三个参数。 第三个参数指定stride,指的是从字符串中取出第一个字符后向前移动多少个字符。 到目前为止,我们已经省略了 stride 参数,Python 默认 stride 为 1,以便检索两个索引号之间的每个字符。

让我们回顾一下上面打印出子字符串“Shark”的示例:

print(ss[6:11])
OutputShark

我们可以通过包含步长为 1 的第三个参数来获得相同的结果:

print(ss[6:11:1])
OutputShark

因此,步长 1 将包含切片的两个索引号之间的每个字符。 如果我们省略 stride 参数,那么 Python 将默认为 1。

相反,如果我们增加步幅,我们将看到字符被跳过:

print(ss[0:12:2])
OutputSmySak

在 Python 语法 ss[0:12:2] 中将步幅指定为 2 作为最后一个参数会跳过所有其他字符。 让我们回顾一下突出显示的字符:

Sammy Shark

请注意,索引号 5 处的空白字符也会被跳过,指定的步长为 2。

如果我们为 stride 参数使用更大的数字,我们将有一个明显更小的子字符串:

print(ss[0:12:4])
OutputSya

在 Python 语法 ss[0:12:4] 中将步幅指定为 4 作为最后一个参数仅每四个字符打印一次。 再次,让我们看一下突出显示的字符:

Sammyark!

在此示例中,空白字符也被跳过。

由于我们打印的是整个字符串,我们可以省略两个索引号并在语法中保留两个冒号以达到相同的结果:

print(ss[::4])
OutputSya

省略两个索引号并保留冒号将使整个字符串保持在范围内,而为 stride 添加最终参数将指定要跳过的字符数。

此外,您可以为步幅指定一个负数值,如果我们将步幅设置为 -1,我们可以使用它以相反的顺序打印原始字符串:

print(ss[::-1])
Output!krahS ymmaS

没有指定参数的两个冒号将包含原始字符串中的所有字符,步幅为 1 将包含每个字符而不跳过,否定该步幅将反转字符的顺序。

让我们再做一次,但步幅为 -2:

print(ss[::-2])
Output!rh ma

在此示例中,ss[::-2],我们正在处理整个原始字符串,因为参数中不包含索引号,并通过负跨度反转字符串。 此外,通过 -2 的步幅,我们跳过了反转字符串的所有其他字母:

!krahS[空白]ymmaS

此示例中打印了空白字符。

通过指定 Python 切片语法的第三个参数,您可以指示从原始字符串中提取的子字符串的步幅。

    1. 计数方法

虽然我们正在考虑与字符串中的字符对应的相关索引号,但值得了解一些计算字符串或返回索引号的方法。 这对于限制我们希望在用户输入表单中接受的字符数或比较字符串很有用。 与其他顺序数据类型一样,可以通过多种方法对字符串进行计数。

我们首先看一下 len() 方法,它可以获取任何序列数据类型的长度,无论是有序的还是无序的,包括字符串、列表、元组字典

让我们打印字符串 ss 的长度:

print(len(ss))
Output12

字符串“Sammy Shark!”的长度长度为 12 个字符,包括空格字符和感叹号。

除了使用变量,我们还可以将字符串直接传递给 len() 方法:

print(len("Let's print the length of this string."))
Output38

len() 方法计算字符串中的字符总数。

如果我们想计算一个特定字符或一个字符序列在字符串中出现的次数,我们可以使用 str.count() 方法。 让我们使用我们的字符串 ss = "Sammy Shark!" 并计算字符“a”出现的次数:

print(ss.count("a"))
Output2

我们可以搜索另一个字符:

print(ss.count("s"))
Output0

尽管字母“S”在字符串中,但重要的是要记住每个字符都区分大小写。 如果我们想不分大小写地搜索字符串中的所有字母,我们可以先使用 str.lower() 方法将字符串全部转换为小写。 您可以在“Python 3 中的字符串方法简介”中阅读有关此方法的更多信息。

让我们尝试 str.count() 与一系列字符:

likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
Output3

在字符串likes中,相当于“likes”的字符序列在原字符串中出现了3次。

我们还可以找到一个字符或字符序列出现在字符串中的什么位置。 我们可以使用 str.find() 方法来做到这一点,它会根据索引号返回字符的位置。

我们可以检查字符串 ss 中第一个“m”出现的位置:

print(ss.find("m"))
Ouput2

第一个字符“m”出现在字符串“Sammy Shark!”中的索引位置 2 处我们可以查看字符串ss 上面的索引号位置。

让我们检查一下字符串 likes 中第一个“喜欢”字符序列的位置:

print(likes.find("likes"))
Ouput6

字符序列“likes”的第一个实例从索引号位置 6 开始,这是序列 likes 的字符 l 所在的位置。

如果我们想看看第二个“喜欢”序列从哪里开始呢? 我们可以通过将第二个参数传递给 str.find() 方法来做到这一点,该方法将从特定的索引号开始。 因此,让我们从索引号 9 之后开始,而不是从字符串的开头开始:

print(likes.find("likes", 9))
Output34

在从索引号 9 开始的第二个示例中,字符序列“likes”的第一次出现从索引号 34 开始。

此外,我们可以指定范围的结束作为第三个参数。 像切片一样,我们可以通过使用负索引号向后计数来做到这一点:

print(likes.find("likes", 40, -6))
Output64

最后一个示例在索引号 40 和 -6 之间搜索“喜欢”序列的位置。 由于输入的最后一个参数是负数,它将从原始字符串的末尾开始计数。

字符串方法len()str.count()str.find()可用于确定字符串中字符或字符序列的长度、计数和索引位置。

##结论

能够调用字符串的特定索引号或字符串的特定片段,在使用这种数据类型时给了我们更大的灵活性。 因为字符串和列表和元组一样,是一种基于序列的数据类型,所以可以通过索引和切片来访问它。

你可以阅读更多关于格式化字符串字符串方法继续学习字符串。