介绍
Python 字符串数据类型是由一个或多个单个字符组成的序列,可以由字母、数字、白色空间字符或符号组成。
本教程将引导您通过索引访问字符串,将它们切成字符序列,并通过一些计数和字符位置方法。
前提条件
如果您没有设置编程环境,您可以参考本地编程环境的安装和安装指南(https://www.digitalocean.com/community/tutorial_series/how-to-install-and-set-up-a-local-programming-environment-for-python-3)或适用于您的操作系统(Ubuntu, CentOS, Debian 等)的编程环境(https://www.digitalocean.com/community/tutorial_collections/how-to-install-python-3-and-set-up-a-programming-environment)。
如何索引字符串
就像 列表数据类型中包含与索引号匹配的项目一样,一个字符串的每个字符也匹配一个索引号,从索引号 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结束。
我们还注意到,Sammy
和Shark
之间的白色空间字符也与其自己的索引号码相匹配,在这种情况下,与白色空间相关的索引号为5。
呼叫点(!
)也具有与其相关的索引号码,任何其他符号或点符号,如 *#$&;?
,也是一个字符,并将与其自己的索引号码相关联。
Python 字符串中的每个字符都有相应的索引号,这使我们能够以与其他序列数据类型相同的方式访问和操纵字符串。
通过积极索引数字访问字符
通过引用索引号码,我们可以隔离一个字符串中的一个字符串,我们通过将索引号码放置在方块上做这件事,让我们宣布一个字符串,打印它,并在方块上调用索引号码:
<$>[info]
信息: 要跟进本教程中的示例代码,请在本地系统上运行python3
命令,打开Python交互壳。
1ss = "Sammy Shark!"
2print(ss[4])
1[secondary_label Output]
2y
当我们参考某个字符串的特定索引号时,Python 会返回位于该位置的字符,因为字母 y
位于字符串 ss = "Sammy Shark!" 的索引号 4 上,当我们打印
ss[4] 时,我们将收到 `y' 作为输出。
索引数字允许我们在字符串中访问特定字符。
通过负索引数访问字符
如果我们有一个长的字符串,我们想指向一个项目的结尾,我们也可以从字符串的结尾回数,从索引号 -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 指数的位置,如下:
1print(ss[-3])
1[secondary_label Output]
2r
使用负索引数可以有利于将单个字符隔离到长串的尽头。
切割 Strings
我们还可以从字符串中调用一系列字符,假设我们只想打印Shark
一词,我们可以通过创建一个 slice,这是一个原始字符串中的字符串。
1print(ss[6:11])
1[secondary_label Output]
2Shark
在构建片段时,如在[6:11]
中,第一个索引数是片段开始的地方(包括),第二个索引数是片段结束的地方(专属),这就是为什么在我们的示例中,范围之上必须是字符串结束后发生的索引数。
当我们切割字符串时,我们正在创建一个 substring,这本质上是一个存在于另一个字符串内的字符串。
如果我们要包含一个字符串的任何一个结尾,我们可以忽略字符串[n:n]
语法中的一个数字,例如,如果我们要打印字符串的第一个单词ss
- Sammy
- 我们可以这样做,键入:
1print(ss[:5])
1[secondary_label Output]
2Sammy
我们这样做是通过在切片语法中忽略结肠前的索引号,并且只包括结肠后的索引号,这指的是底线的尽头。
要打印从字符串的中间开始并打印到尾部的字符串,我们可以这样做,如下:
1print(ss[7:])
1[secondary_label Output]
2hark!
仅包含指数号前的指数号,并将第二个指数号留在语法中,基础字符串将从指数号的字符号转到字符串的末尾。
您也可以使用负索引数来切割一个字符串. 正如我们之前所做的,一个字符串的负索引数从 -1 开始,然后从那里计算下来,直到我们到达字符串的开始。
让我们使用两个负索引数字来切断字符串ss
:
1print(ss[-4:-1])
1[secondary_label Output]
2ark
Sammy Shark!
字符串中打印了表
字符串,因为字符a
发生在 -4 指数位位置,而字符k
发生在 -1 指数位位置之前。
定义 Stride 在切割 Strings 时
字符串切割可以接受第三个参数除了两个索引数之外。第三个参数指定了 stride,指的是在从字符串中获取第一个字符后要移动多少个字符。
让我们来回顾上面的例子,它打印出Shark
字符串:
1print(ss[6:11])
1[secondary_label Output]
2Shark
我们可以通过包含一个第三个参数以1的步骤来获得相同的结果:
1print(ss[6:11:1])
1[secondary_label Output]
2Shark
因此,一个步骤的1将采取在一个片段的两个索引数字之间的每个字符. 如果我们忽略了步骤参数,那么Python将默认为1。
如果相反,我们增加步伐,我们会看到字符被跳过:
1print(ss[0:12:2])
1[secondary_label Output]
2SmySak
指定 2 的步骤作为 Python 语法中的最后一个参数 ss[0:12:2]
会跳过每一个其他字符。
萨米鲨鱼!
请注意,在索引号 5 上的白空间字符也被跳过,指定了 2 的步骤。
如果我们使用一个较大的数字为我们的步数参数,我们将有一个显著较小的基数:
1print(ss[0:12:4])
1[secondary_label Output]
2Sya
指定 4 步作为 Python 语法中的最后一个参数 ss[0:12:4]
只打印了每四个字符。
萨米鲨鱼!
在此示例中,白空间字符也被跳过。
由于我们正在打印整个字符串,我们可以忽略两个索引数字,并将两个列保持在语法中,以达到相同的结果:
1print(ss[::4])
1[secondary_label Output]
2Sya
忽略两个索引数字并保留列将使整个字符串保持在范围内,而添加步骤的最终参数将指定要跳过的字符数目。
此外,您可以为步骤表示负数值,如果步骤设置为 -1,我们可以使用它来按逆顺序打印原始步骤。
1print(ss[::-1])
1[secondary_label Output]
2!krahS ymmaS
没有指定参数的两个列将包含原始字符串的所有字符,1的步骤将包含不跳过的每个字符,否定该步骤将扭转字符的顺序。
让我们再次这样做,但用 -2 的步骤:
1print(ss[::-2])
1[secondary_label Output]
2!rh ma
在这个例子中, ss[::-2]
,我们正在处理原始字符串的全部,因为没有指数数字被包含在参数中,并通过负步翻转字符串。
!krahS[whitespace]ymmaS
whitespace 字符在本示例中印刷。
通过指定 Python 片段语法的第三个参数,您表示您正在从原始字符串中拉取的字符串的步伐。
计数方法
虽然我们正在考虑与字符符串中的相关索引号码,但值得通过一些方法来计算字符串或返回索引号码,这可能有助于限制我们希望在用户输入表单中接受的字符数目,或者比较字符串。
首先,我们将看看len()
方法,它可以获得任何序列的数据类型的长度,无论是排序或非排序,包括字符串,列表, tuples和 字典。
让我们打印字符串ss
的长度:
1print(len(ss))
1[secondary_label Output]
212
Sammy Shark!
字符串的长度为12个字符,包括白空间字符和呼声点符号。
而不是使用变量,我们也可以将字符串直接传入‘len()’方法:
1print(len("Let's print the length of this string."))
1[secondary_label Output]
238
len()
方法计算一个字符串内的字符总数。
如果我们想计算一个特定的字符或字符序列在字符串中出现的次数,我们可以使用 str.count()
方法来计算。
1print(ss.count("a"))
1[secondary_label Output]
22
我们可以寻找另一个特征:
1print(ss.count("s"))
1[secondary_label Output]
20
虽然字母S
在字符串中,但重要的是要记住,每个字符都是案例敏感的。如果我们想要搜索一个字符串中的所有字母,无论案例如何,我们可以使用str.lower()
方法将字符串转换为所有较低的案例。
让我们尝试 str.count()
用一个字符序列:
1likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
2print(likes.count("likes"))
1[secondary_label Output]
23
在喜欢
字符串中,相当于喜欢
的字符串在原始字符串中发生3次。
我们还可以找到字符或字符序列在字符串中发生的位置,我们可以使用 str.find()
方法来做到这一点,它会根据索引号返回字符的位置。
我们可以检查在字符串ss
中第一个m
发生的地方:
1print(ss.find("m"))
1[secondary_label Ouput]
22
第一个字符m
发生在字符串Sammy Shark!
中的 2 的索引位置上,我们可以查看字符串 ss
上方的索引号位置。
让我们检查一下喜欢
字符串中的第一个喜欢
字符串发生在哪里:
1print(likes.find("likes"))
1[secondary_label Ouput]
26
字符序列喜欢
的第一个实例从索引号位置6开始,这就是喜欢
序列的字符l
的位置。
如果我们想看到喜欢
的第二个序列从哪里开始?我们可以通过将第二个参数传递到str.find()
方法中,该方法将从一个特定的索引号开始。
1print(likes.find("likes", 9))
1[secondary_label Output]
234
在此第二个示例中,指数数为9,字符序列喜欢
的第一个出现开始于指数数为34。
此外,我们可以将范围的结尾指定为第三个参数,就像切割一样,我们可以通过使用负索引数进行回数:
1print(likes.find("likes", 40, -6))
1[secondary_label Output]
264
这个最后一个示例在 40 和 -6 的索引数字之间搜索喜欢
序列的位置。
「len()」、「str.count()」和「str.find()」的字符串方法可以用来确定字符串中的长度、字符串或字符串的计数以及字符串或字符串的索引位置。
结论
能够调用特定索引数的字符串或某个字符串的特定片段,使我们在处理此数据类型时更灵活,因为字符串,如列表和字符串,是基于序列的数据类型,因此可以通过索引和切割访问。