8. 字符串详解
Hi, 大家好。我是茶桁。
前几节课中我们学习了函数,那么这节课开始,我们花几节课返过头来详细的学习一下 Python 内的数据类型。第一节课,让我们先从字符串开始:
回顾字符串的定义方式
了解转义字符
字符串格式化的方法
字符串相关函数
字符串的定义方式
单引号定义字符串
‘ ’
双引号定义字符串
“ ”
三引号定义字符串
‘’‘内容’‘’
或者“”“内容”“”
字符串定义时,引号可以互相嵌套
转义字符
一个普通的字符出现在转义符
\
的后面时,实现了另外一种意义。
\
转义符,续行符。
作为转义符时,在\
后面出现的字符可能会实现另外一种意义。
作为续行符时,在行尾使用了\
后,可以换行继续书写内容。
打印结果看,并未换行,说明续行符起作用了。
\n
代表一个换行符
\r
代表光标位置(从\r
出现的位置开始作为光标的起点)
\t
代表一个水平制表符(table 缩进)
\b
代表一个退格符
注意看,并不是毫无改变的打印出来了,整句话中\b
前面的刀
这个字被退格了。
\\
反转义\
,输出了\
,取消\
的转义效果
第二个\
被前面的\
转义了,所以n
就不会再被转义,也就没有换行。
r
, 如果我们想把转义字符也作为普通字符输出,那我们可以在字符串的最前面加上r
字符串内的转移字符\n
被打印了出来。
字符串相关的操作
字符串
+
操作, 将参与运算的字符串相加后组成一个新的字符串。
字符串
*
操作,str*n
就是 将当前字符串重复n
遍
字符串
[]
切片操作
字符串的索引操作,字符串中只能使用[]
下标访问,不能修改。
因为所有参数都是可选项,所以其实我们可以什么参数都不给,直接使用默认值:
当我们写一个值,那就是获取指定下标的元素:
但是当我们只写一个值,并且后面跟上符号::
, 那含义就是从start
开始,向后取完:
从这我们可以看出来,当我们只写一个单独的值而没有加::
的时候,含义就是从start
开始,但是并不向后继续取值,而有了::
就是继续向后取值。其实,只写一个:
也是一样的,因为只要知道向后取值,step
默认值就是为1
:
那如果我们在这个基础上加上一个值,那就是从start
开始直到stop
之前。和range()
一样,取不到stop
。
然后再多加一个值,和range()
一样,就是往后数step
个数再取值:
其实,这里比较饶的并不是如何取值,二是::
这两个符号。当我们将上面讲的这些内容了解通透后,就可以玩转字符串的切片了。
那对应的,如果我们想将字符串完全取值,但是是隔一个取一个,那我们就可以使用start
和stop
的默认值,而只定义step
那如果我们想让整个字符串倒过来呢?
字符串的格式化方法
常用的字符串的格式化方法就是format()
先让我们看看最普通的方式:
我定义了这两个字符串,现在我想将两段字符串合在一起变成一句“茶桁乘舟将欲行,忽闻岸上踏歌声。”(嗯,权吾乃青蓮居士。)
很多小伙伴是不是觉得太简单了,我们之前学了+
号,直接拼接不就好了。自然也是可以的,只是我们现在要用更普遍和便捷的方式来完成:
假如说,我们现在只有诗词的大半句,其中少了踏歌行这三个字,那我们又该如何?那我们就往format
中传入两个参数,后面那个参数自定义出这三个字符就可以了:
看到这里,我们是不是认为字符串使用format
就只能顺序传值?第一个答案填入第一个空,第二个答案填入第二个空... 其实不只是如此,字符串后使用format
,其中的{}
还可以接受索引传参:
通过索引传参的适用范围毕竟还是有限,我们很容易一不小心就会把参数顺序搞乱。那还有没有其他办法呢?
我们还可以通过关键字传参:
那假如说我们得到的是一个列表数据,是否需要先转换数据?其实也没必要,format
支持对容器型数据的传参数:
那么如果是字典类型的呢?那就更简单了,我们之前提到的关键字传参,不就正好对应字典吗?
嗯,不错。似乎我们创建了一句新的诗句。
其实,format
还有其他的用法,就是直接用关键字f
, 比如:
f
是在 3.7 版本中新增的格式化方法,在使用的过程中,要注意字符串符号“”
和‘’
的嵌套关系。
在基本使用之外,我们还有一些风骚的特殊用法,比如,我们可以用format
直接限定小数的位数:
字符串相关函数
在 Python 中,字符串应该是最常见的数据类型,对应字符串的函数也有不少。大家可以去看看官方的文档
英文字符与字符检测相关函数
我们可以返回字符串的副本,并且将首字母大写,其余小写:
因为我在使用 Jupyter Notebook,所以即便我么有使用
可以把字符串中的一个单词的首字母大写:
可以全部改为大写:
把字符串全部改为小写
字符串中的大小写字符转换,大写转小写,小写转大写:
检测字符是否包含在字符串内:
检测字符串是否为全部大写字母组成
检测字符串是否为全部小写字母组成
检测字符串是否符合标题title
的要求
检测字符串是否由数字和字母组成,如果字符串中包含来非数字字母的其它字符,则返回 False
检测字符串是否全部由字符(包含英文字符和中文)组成
检测字符串是否由纯数字字符组成
检测当前字符串是否为 空格 字符组成 ' ’
检测字符串是否以指定的字符开始的,也可以指定开始和结束的位置
检测字符串是否以 指定的字符 结束的,也可以指定开始和结束的位置
字符串的查找和操作相关函数(✨ 重点)
前面铺垫了那么多之后,接下来这部分,才是这一节的重点。
让我们先从查找来看:
str.find(sub[, start[, end]])
find
会返回一个子字符串,找到字符中符合条件的第一个字符出现的索引位置,未找到则返回-1
让我们用切片的方式反过来找一下看看:
我们从之前可以知道res
取值为2
,现在等于是str[2:4]
, 正好是am
所在的位置。
find
中有start
和end
,是支持切片查找的:
可以看到,在从 4 开始找到 10 的时候找不到am
, find
有一个功能相同,但是方向不同的方法rfind()
, 和find
的不同点只是,rfind
是从后往前找的。
str.index(sub[, start[, end]])
类似于find()
, 但在找不到子字符串的时候会引发ValueError
str.count(sub[, start[, end]])
这个函数会在字符串中去查找sub
在其中[start, end]
范围内非重叠出现的次数。
接下来让我们看看字符串操作相关的函数:
str.split(sep=None, maxsplit=-1)
这个方法可以按照指定的分隔符(sep
),把字符串分隔成列表。
整个方法里的maxsplit
是进行多少次拆分,比如1
为一次拆分,也就是会返回 2 个元素。默认值为-1
,意思是不限制拆分次数。
str.rsplit(sep=None, maxsplit=-1)
和split
方法相似,只是方向不同。这个是从后向前获取。
这段代码可以看到功能上是完全一样的,如果我们把maxsplit
加进去,就能看到方向上的不同:
这样就能清晰看到,rsplit
是从后面开始拆分的。
str.join(iterable)
join
的功能和split
可以看成是相反的,是使用指定的字符串,把一个容器中的元素连接成一整个字符串
str.strip([chars])
去除字符串左右两侧的指定字符, chars
参数为置顶要溢出字符的字符串,默认移除空白符。
这个函数有两个伴生函数,一个是rstrip
, 从方法名应该能猜的出来,这是去掉字符串右侧的指定字符,另一个是lstrip
, 这是去除左侧的指定字符。
len()
函数可以获取当前字符串的长度
str.replace(old, new[, count])
可以替换对应的字符串,将old
都替称为new
。count
则是替换次数。比如一个字符串内出现了十次old
, 我``count给的5, 则只替换前5次出现的
old`字符串。
可以注意一下两次打印的区别。
这次就不留练习题了,字符串的查询和操作函数属于重中之重,大家最好是多去练习几遍,将其中的方法记会杯熟。
好,今天就到这里。咱们下节课再见。
版权声明: 本文为 InfoQ 作者【茶桁】的原创文章。
原文链接:【http://xie.infoq.cn/article/3f536434a9863c3983df693cd】。文章转载请联系作者。
评论