1.2.2 针对字符串的操作

在Python里,可以用单引号或双引号来定义字符串,而且Python还提供了若干针对字符串的操作方法。在如下的StringDemo.py案例中,我们将看到字符串的常见用法。


01 logMsg='in StringDemo.py'
02 logMsg=logMsg+",connect String"
03 # in StringDemo.py,connect String
04 print(logMsg)
05 twoLineStr="first line\nsecond line"
06 print(twoLineStr)
07 print(len(logMsg)) # 31
08 print(logMsg.replace('in','for') )
09 print(logMsg.find('StringDemo')) # 3
10 print(logMsg.find('Not Exist'))  # -1
11 print(logMsg.index('StringDemo')) # 3
12 # print(logMsg.index('Not Exist'))

在第1行里,我们通过单引号定义了名为logMsg的字符串,在第2行里,我们通过+符号实现了字符串连接的操作,注意待拼接的字符串是用双引号定义的。从第4行的输出语句里,我们能看到拼接后的效果。

在第5行里,我们在twoLineStr里引入了\n这个换行符,通过第6行的输出语句就能看到换行的效果。如果把其中的\n换成\t,还能看到加入tab符的空格效果。\n和\t叫作转义符,还有其他转义符,但比较常用的就是这两个。

在第7行里,我们使用了len方法输出字符串的长度,在第8行里,我们通过replace方法实现了替换字符串字符的效果,其中第一个参数表示待替换字符,第二个参数表示替换字符,该句的输出结果是“for StrforgDemo.py,connect Strforg”,其中的in都替换成了for。

第9行和第10行演示了通过find方法查找特定字符或字符串的用法。其中,第9行是在logMsg里查找StringDemo,返回结果是3,表示在第3个位置;第10行查找Not Exist这个字符串,没有找到,所以返回-1。

第11行和第12行给出的index方法也能起到查找的作用,有所区别的是,如果出现类似第12行没有找到的情况,不会像find方法那样返回-1,而是会抛出异常。如果打开第12行的注释语句,就能看到“由于没找到而抛出异常”的情况。

在上述案例中,我们演示了针对字符串的常用操作。事实上,在项目的实际应用中,我们经常对字符串进行分片操作,在如下的StrSplitDemo.py案例中就演示了此类做法。


01 logMsg='in StringDemo.py'
02 print(logMsg[0:4])# in S
03 print(logMsg[1:4])# n S
04 print(logMsg[:5])# in St
05 print(logMsg[10:])# emo.py
06 print(logMsg[-1])# y
07 print(logMsg[10:-3])# emo
08 newLogMsg=logMsg[0:4]
09 logMsg=logMsg.replace('in','for')
10 print(newLogMsg)# in S

在Python里没有像Java那样的截取字符串的方法subString,所以会用诸如[起始值:终止值]的方法对字符串进行分片操作,在上述代码里,我们归纳了相关用法。

用法1:如第2行和第3行那样,起始值和终止值都有值,且为正数。这里请注意,索引号是从0开始的,其中第一个i的索引号是0,索引号是4的字符是t,具体分片截取的时候,包含起始索引的字符,但不包含终止索引的字符。从第2行和第3行的输出结果就能验证这一点。

用法2:如第4行和第5行那样,起始值和终止值中只有一个有值,且为正数。比如第4行起始值空缺,表示从起始位开始分片;第5行只有终止值,表示分片的结束位是结尾。分片时,同样包含起始索引字符,但不包含终止索引字符。

用法3:如第6行所示,只有一个值,表示只截取该索引值指定的字符,而且这里的值是-1(负号表示从右边开始算,-1表示截取右边第1个字符),结果是y。

用法4:如第7行所示,起始值或终止值中有一个值是负数。刚才已经讲了,负数表示从右边开始计算,这里的10:-3表示从第10个索引开始,含索引号是10的字符,截取到右边算起第3个字符(该字符是“.”,但不包含该字符),结果是emo。

分片后的新字符和老字符无关,对其中一个的操作不会影响到对方,比如我们在第8行用logMsg分片的结果创建了新字符newLogMsg,在第9行里用replace方法对老字符进行了替换操作,但从第10行输出新字符的结果来看,新字符并没有受字符串替换的影响。