![]() |
5.4 字符串下标与切片 |
字符串是由字符所组成的列表对象(类似于其他语言中的数组),如果想要获取字符串中的字符,有三种方式:
(1)通过下标值(index,或称为索引值)来获取某个字符。
(2)使用切片(slice)方法获取某段字符串。
(3)调用split()方法分割字符串。
字符串对象可以使用下标值来获取字符,下标值从0开始,假设有一个字符串str1="Hello",那么str1的长度就是5,字符串中的元素分别为str1[0]、str1[1]、str1[2]、str1[3]、str1[4]。
下标值为正值,表示从字符串开始处从左往右数,负值则表示从字符串末尾从右往左数,例如str1[0]表示获取字符串的第1个字符,str1[-1]表示获取字符串的最后一个字符。譬如以下程序语句,分别是获取第1个字符与倒数第2个字符:
str1 = "Hello!How are you?" print(str1[0]) #执行结果:H print(str1[-2]) #执行结果:u
字符串对象一旦被赋值或设置,它的内容就是不可变的(immutable),重新给字符串对象赋值是创建一个新的字符串而不是修改原字符串,原来的字符串对象会在适当的时机通过Python的垃圾回收机制被系统回收。因此,字符串对象可以使用下标值来读取其中的字符,但是不能通过下标值给对应的字符串位置赋值(这点和字符数组不一样)。例如下面的程序语句就会发生错误:
str1[0] = "A"
slice(切片),顾名思义就是从字符串中读取某一段字符串,字符串的字符具有顺序性,我们可以使用“[]”运算符来读取字符串中的单个字符或子字符串,这个操作被称为“切片”。格式如下:
字符串[起始下标:结束下标:间隔值]
对字符串进行“切片”时,如果不用间隔取值,就可以省略间隔值不写。我们在表5-4中整理出了使用“[]”运算符读取序列元素的方法。
表5-4
例如以下字符串切片运算:
str1 = "ABCDEFGHIJK" print(str1[3:6]) #执行结果DEF
上面的程序语句表示从下标值3开始一直读取到结束下标6-1为止,所以会取出DEF字符串。也就是说,slice方法读取的字符串长度正好是结束下标与起始下标相减得到的差值,在此例中,str1[3:6]读取的字符串长度是6-3=3。
如果是从头开始读取字符串,那么起始下标可以省略不写;如果要读取到字符串结尾,那么结束下标可以省略不写,举例来说(slice.py):
str1 = "ABCDEFGHIJK" print(str1[:7:2]) # ACEG print(str1[2::2]) # CEGIK print(str1[::2]) # ACEGIK
上述程序第2行到第4行都是每间隔2个字符读取字符串,第2行语句没有写起始下标,表示从起始位置(也就是下标值0)开始;第3行语句没有写结束下标,表示读取到最后一个字符;第4行语句既没有起始下标又没有结束下标,表示目标是读取完整的str1字符串。
split()方法可以按照指定分隔符将字符串分割为子字符串,并返回子字符串的列表。格式如下:
字符串.split(分隔符, 分割次数)
默认的分隔符为空字符串,包括空格符、换行符(\n)、制表符(\t)。调用split()方法分割字符串时,会将分割后的字符串以列表(list)返回。范例程序如下:
【范例程序:split.py】分割字符串
01 str1 = "Do \none \nthing \nat a time!" 02 print( str1.split() ) 03 print( str1.split(' ', 1 ) )
程序的执行结果如图5-4所示。
图5-4
程序解析:
·第02行:没有指定分割字符,所以会以空格与换行符(\n)进行分割。
·第03行:指定以空格来分割,因而分割了2个子字符串之后就不再分割了。
以下范例程序使用前面介绍的切片运算将26个小写英文字母反转输出,大家不妨上机练习看看。
【范例程序:ReverseString.py】将26个小写英文字母反转后输出
01 # -*- coding: utf-8 -*- 02 letters = "" 03 for x in range(97, 123): 04 letters += str(chr(x)) 05 print(letters) 06 07 revletters = letters[::-1] 08 print(revletters)
程序的执行结果如图5-5所示。
图5-5
范例中调用chr()函数返回ASCII码对应的字符,并使用for循环将字符相加后赋值给变量letters,再调用切片(slice)方法将字符串反转。这里所用的ASCII码采用了十进制表示法,97~122分别对应的是小写英文字母a~z,而65~90对应的是大写英文字母A~Z,供大家参考。
chr()函数可以返回ASCII码对应的字符,调用ord()函数可以返回字符对应的ASCII码。
【范例程序:ReverseStringBIG.py】将26个大写英文字母反转后输出
01 # -*- coding: utf-8 -*- 02 letters = "" 03 for x in range(65, 91): 04 letters += str(chr(x)) 05 print(letters) 06 07 revletters = letters[::-1] 08 print(revletters)
程序的执行结果如图5-6所示。
图5-6
同理,若要反转数字,则可以参考下面的范例程序。
【范例程序:ReverseString.py】将数字反转后输出
01 # -*- coding: utf-8 -*- 02 letters = "" 03 for x in range(48, 58): 04 letters += str(chr(x)) 05 print(letters) 06 07 revletters = letters[::-1] 08 print(revletters)
程序的执行结果如图5-7所示。
图5-7
这里要补充一点,split()的作用是将字符串分割,而join()方法正好相反,它会把字符串串接起来。