字符串是由Python内置的str类定义的,是由一系列Unicode编码的字符组成的有序序列。字符串是一种不可变对象,字符串中的字符是不能被改变的,每当修改字符串时都将生成一个新的字符串对象。对于字符串可以进行各种各样的操作,主要包括通过索引访问指定位置的单个字符,通过切片从给定的字符串中获取某个子串,将两个或多个字符串连接成一个新的字符串,对两个字符串进行比较,使用for循环遍历字符串。
字符串是由一系列Unicode编码的字符组成的序列类型,可以使用方括号运算符[]和一个数字索引来访问指定位置上的字符,其一般语法格式如下:
字符串[索引]
其中字符串可以是字符串类型的常量、变量或表达式;索引可以是一个整数类型的常量、变量或表达式,用于对字符串中的字符进行编号,索引值可以是正数、负数和0。按从左向右的顺序,左边第一个字符的索引为0,第二个字符的索引为1,最右边字符的索引比字符串的长度小1。字符串的长度可以使用内置函数len()求出。索引值也可以是负数,负数表示从右向左进行编号,-1表示最右边字符(即倒数第一个字符)的索引,-2表示倒数第二个字符的索引,以此类推。
字符串s中各个字符的索引设置如图3-1所示。
图3-1 字符串中字符的索引
通过索引访问字符串中的指定字符时,所使用的索引值必须是整数。使用正向索引时,最小值为0,最大值比字符串长度小1;使用反向索引时,最小值为字符串长度值的相反数,最大值为-1。无论使用正向索引还是反向索引,索引值都不能越界,否则将会出现错误信息“IndexError:string index out of range”,即字符串索引超出范围。
下面给出通过索引获取指定位置上字符的例子。
>>>s=″Hello,Python″
>>> s[0]
′H′
>>> s[1]
′e′
>>> s[-1]
′n′
>>> s[-2]
′o′
因为字符串属于不可变对象,所以使用索引只能读取字符串指定位置上的字符,而不能修改该位置上的字符。例如,如果试图对 s[0]重新赋值,则会出现错误信息“TypeError:′str′object does not support item assignment”,即字符串对象不支持赋值操作。
因为字符串属于序列类型,所以可以使用for循环来遍历字符串。例如:
【例3.4 】 从键盘输入一个字符串,然后以相反顺序输出该字符串。
【算法分析】
要按相反顺序输出字符串,可以使用while循环和负数索引来实现。以索引值作为循环变量,该变量的初始值为-1,终止值为字符串长度的相反数,字符串长度用len()函数求出。每输出一个字符后使循环变量减1。
【程序代码】
【运行结果】
使用索引可以读取字符串指定位置上的单个字符。如果要按位置从字符串中提取一部分字符(称为子串),则可以通过切片(slice)操作来实现,其一般语法格式如下:
字符串[开始位置:结束位置:步长]
其中字符串可以是字符串类型的常量、变量或表达式;开始位置、结束位置和步长均为整数,对它们使用冒号进行分隔;开始位置指定开始切片的索引值,默认值为0;结束位置指定结束切片的索引值,但不包括这个位置在内,默认值为字符串的长度;步长用于指定索引值每次增加的数值,默认值为1;当省略步长时,也可以顺便省略最后一个冒号。
下面给出字符串切片操作的一些例子。
由于字符串是不可变对象,因此不能对字符串切片赋值,否则会出现错误信息“TypeError:′str′object does not support item assignment”。
【例3.5 】 从键盘输入一个字符串,然后通过切片操作实现字符串的逆序输出。
【算法分析】
可通过字符串切片操作来实现字符串逆序输出,在方括号运算符中省略开始位置和结束位置参数,并将步长设置为-1即可。
【程序代码】
s=input(″请输入一个字符串:″)
print(s[::-1])
【运行结果】
在Python中,字符串的连接可以使用加法运算符“+”或乘法运算符“*”来实现。加法运算符可以将两个字符串连接成一个新的字符串,乘法运算符则可以将一个字符串自身重复连接若干次而形成一个新的字符串。当用于字符串连接时,运算符“+”和“*”均支持复合赋值操作。
1.基本连接
在Python中,运算符“+”有3个作用,一是作为双目运算符用于数值对象,进行加法运算;二是作为单目运算符用于数值对象,表示正号;三是作为双目运算符用于字符串对象,进行字符串的连接操作。
将运算符“+”作为字符串连接运算符使用时,可以将字符串常量、字符串变量以及返回值为字符串的函数表达式等字符串数据连接起来,由此构成一个字符串表达式,其一般语法格式如下:
字符串1+字符串2+…+字符串 n
其中各个字符串可以是字符串类型的常量、变量或函数。整个字符串表达式的值也是字符串类型。
例如,下面的例子用于连接两个字符串,程序运行结果是生成了一个新的字符串。
>>>″Python″+″程序设计″
′Python程序设计′
将运算符“+”作为字符串连接运算符使用时,该运算符两侧都必须是字符串类型。若要将字符串与数值连接起来,则应使用内置函数str()将数值转换为字符串。例如:
>>>str(2018)+″年″+str(1)+″月″+str(31)+″日″
′2018年1月31日′
2.重复连接
在Python中,运算符“*”是一个双目运算符,它有两个作用,一是作为算术运算符用于数值对象,进行乘法运算;二是作为重复连接运算符用于字符串和正整数,进行字符串的重复连接操作。
将运算符“*”作为字符串重复连接运算符使用时,可以将一个字符串自身重复连接若干次,从而构成一个字符串表达式,其一般语法格式如下:
字符串*正整数
或者
正整数*字符串
其中字符串可以是字符串类型的常量、变量或函数,正整数用于指定这个字符串重复连接的次数。
下面的例子中,将字符串“Python”重复连接3次,得到一个新的字符串:
>>>x=″Python″
>>> n=3
>>> x*n
′PythonPythonPython′
【例3.6 】 从键盘输入一些单词,然后使用这些单词组成一个句子。
【算法分析】
由于输入单词的数目不确定,因此可以考虑使用条件恒真的while语句来构成一个无限循环。当输入指定的内容时,将执行break语句以结束循环过程。使用字符串连接运算符连接所输入的单词,即可将其连词成句。
【程序代码】
【运行结果】
对于字符串进行的关系运算主要包括:使用各种关系运算符对两个字符串进行比较,使用成员运算符in来判断一个字符串是不是另一个字符串的子串。
1.比较字符串
比较两个字符时,是按照字符的Unicode编码值的大小进行比较的。西文字符按其ASCII编码值(与其Unicode编码相等)进行比较的,其按从小到大顺序排列,依次是空格字符、数字字符、大写字母以及小写字母。中文字符是按其Unicode编码值进行比较的。例如:
>>>″a″>″b″
False
>>>″9″<″m″
True
>>>″啊″>″中″
True
″啊″>″A″
True
比较两个长度相同的字符串时,是将两个字符串的字符从左向右逐个进行比较,如果所有字符相等,则两个字符串相等;如果两个字符串中有不同的字符,则以最左边第一对不同的字符的比较结果为准。例如:
比较两个长度不相同的字符串时,首先在较短的字符串尾部补上一些空格字符,使两个字符串具有相同的长度,然后再进行比较。例如:
2.判断子串
在Python中,成员关系运算符in用于测试指定的值是否包含在目标序列中。使用该运算符可以判断一个字符串是否为另一个字符串的子串,其一般语法格式如下:
字符串1 [not] in 字符串2
如果字符串1是字符串2的子串,则返回True,否则返回False。
下面给出使用in运算符判断子串的一些例子。
>>>″yt″in″Python″
True
>>>″mn″in″Python″
False
【例3.7 】 从键盘输入两个字符串,比较它们的大小并判断第一个字符串是不是第二个字符串的子串。
【算法分析】
首先通过内置input()函数来输入两个字符串并将其存储在变量s1和s2中,然后使用多分支if语句来判断两个字符串之间的大小关系,最后使用另一个多分支if语句来判断第一个字符串是否是第二个字符串的子串。
【程序代码】
【运行结果】
再次运行程序:
在Python中,字符串类型可以看成是名称为str的类,而具体的字符串则可以看成由str类定义的对象。字符串对象支持很多方法,可以用来对字符串处理。这些方法需要通过对象名和方法名来调用,其语法格式为:对象名.方法名(参数)。
若要进行字母的大/小写转换,则可以通过以下方法来返回一个新字符串。
1)s.upper(),全部转换为大写。
2)s.lower(),全部转换为小写。
3)s.swapcase(),大/小写互换。
4)s.capitalize(),整个字符串的首字母变成大写,其余字母变成小写。
5)s.title(),每个单词的首字母大写,其余字母均为小写。
【例3.8 】 字母大/小写转换操作示例。
【程序代码】
s=″Knowledge is power.″
print(″字符串原来内容:{0}″.format(s))
print(″全部转换为大写:{0}″.format(s.upper()))
print(″全部转换为小写:{0}″.format(s.lower()))
print(″大/小写互换:{0}″.format(s.swapcase()))
print(″句子首字母大写:{0}″.format(s.capitalize()))
print(″全部单词首字母大写:{0}″.format(s.title()))
【运行结果】
字符串原来内容:Knowledge is power.
全部转换为大写:KNOWLEDGE IS POWER.
全部转换为小写:knowledge is power.
大/小写互换:kNOWLEDGE IS POWER.
句子首字母大写:Knowledge is power.
全部单词首字母大写:Knowledge Is Power.
若要设置字符串的输出宽度、填充字符和对齐方式,则可以通过以下方法来返回一个新字符串。
1)s.ljust(width[,fillchar]):用于输出width个字符,左对齐,右边不足部分使用fillchar(默认为空格)填充。
2)s.rjust(width[,fillchar]):用于输出width个字符,右对齐,左边不足部分使用fillchar(默认为空格)填充。
3)s.center(width[,fillchar]):用于输出width个字符,居中对齐,两边不足部分使用fillchar(默认为空格)填充。
4)s.zfill(width):用于将字符串长度变成width,字符串右对齐,左边不足部分使用0填充。
【例3.9 】 设置字符串对齐方式操作示例。
【程序代码】
s=″Knowledge is power.″
print(″字符串原来内容:{0}″.format(s))
print(″左对齐:{0}″.format(s.ljust(30,″#″)))
print(″右对齐:{0}″.format(s.rjust(30,″#″)))
print(″居中对齐:{0}″.format(s.center(30,″#″)))
print(″用0填充:{0}″.format(s.zfill(30)))
【运行结果】
字符串原来内容:Knowledge is power.
左对齐:Knowledge is power.###########
右对齐:###########Knowledge is power.
居中对齐:#####Knowledge is power.######
用0填充:00000000000Knowledge is power.
对字符串进行搜索操作可以通过以下方法来实现。
1)s.find(substr[,start[,end]]):用于检测substr是否包含在s中,若是则返回开始的索引值,否则返回-1;若用start和end指定范围,则在s[start:end]中搜索。
2)s.index(substr[,start[,end]]):用法与find()相同,只是当substr不在s中时会报一个异常。
3)s.rfind(substr[,start[,end]]):用法与find()相同,只是从右边开始查找。
4)s.rindex(substr[,start[,end]]):用法与rfind()相同,只是当substr不在s中时会报一个异常。
5)s.count(substr[,start[,end]]):用于返回substr在s中出现的次数,若用start和end指定范围,则返回在s[start:end]中str出现的次数
6)s.startswith(prefix[,start[,end]]):用于检查字符串是否是以prefix开头,若是则返回True,否则返回False。如果用start和end指定范围,则在该范围内检查。
7)s.endswith(suffix[,start[,end]]):用于检查字符串是否是以suffix结尾,若是则返回True,否则返回False。如果用start和end指定范围,则在该范围内检查。
【例3.10 】 在字符串中搜索操作示例。
【程序代码】
s=″This is a book.″
print(″字符串内容:{0}″.format(s))
print(″\″is\″首次出现的位置:{:d}。″.format(s.find(″is″)))
print(″\″at\″首次出现的位置:{:d}。″.format(s.find(″at″)))
print(″\″is\″最后出现的位置:{:d}。″.format(s.rfind(″is″)))
print(″\″oo\″首次出现的位置:{:d}。″.format(s.index(″oo″)))
print(″\″s\″最后出现的位置:{:d}。″.format(s.rindex(″s″)))
print(″\″o\″出现的次数:{:d}。″.format(s.count(″o″)))
print(″该字符串以\″Th\″开头吗?{0}。″.format(″是″if s.startswith(″Th″) else″不是″))
print(″该字符串以\″at\″结尾吗?{0}。″.format(″是″if s.startswith(″at″) else″不是″))
【运行结果】
字符串内容:This is a book.
″is″首次出现的位置:2。
″at″首次出现的位置:-1。
″is″最后出现的位置:5。
″oo″首次出现的位置:11。
″s″最后出现的位置:6。
″o″出现的次数:2。
该字符串以″Th″开头吗?是。
该字符串以″at″结尾吗?不是。
若要对字符串进行替换操作,可以通过以下方法返回一个新的字符串。
1)s.replace(s1,s2[,count]),将s中的s1替换成s2。若指定count,则替换count次。
2)s.strip([chars]),在s前后移除由chars指定的字符(默认为空格)。
3)s.lstrip([chars]),在s左边移除由chars指定的字符(默认为空格)。
4)s.rstrip([chars]),在s右边移除由chars指定的字符(默认为空格)。
5)s.expandtabs([tabsize]),将s中的tab符号转为tabsize个空格,默认为8个空格。
【例3.11 】 在字符串中进行替换操作示例。
【程序代码】
s=″Hello,Python″
print(″原字符串:{0}。″.format(s))
print(″用*替换o:{0}。″.format(s.replace(″o″,″*″)))
s=″ Hello,Python ″
print(″原字符串:{0}。″.format(s))
print(″移除左空格:{0}。″.format(s.lstrip()))
print(″移除右空格:{0}。″.format(s.rstrip()))
print(″移除两侧空格:{0}。″.format(s.strip()))
【运行结果】
原字符串:Hello,Python。
用*替换o:Hell*,Pyth*n。
原字符串:Hello,Python。
移除左空格:Hello,Python。
移除右空格:Hello,Python。
移除两侧空格:Hello,Python。
字符串的拆分和组合可以通过以下方法来实现。
1)s.split(sep[,num]):以sep为分隔符将s拆分为列表,默认的分隔符为空格;num指定拆分的次数,默认值为-1,表示无限制拆分。
2)s.rsplit(sep[,num]):与split()类似,只是从右边开始拆分。
3)s.splitlines([keepends]):按行(″\r″、″\r\n″、″\n″)将 s 拆分成列表;若参数 keepends为True,则保留换行符。
4)s.partition(sub):从sub出现的位置作为第一个位置开始,将字符串s拆分成一个元组(sub左边字符串,sub,sub右边字符串);若s中不包含sub,sub左边字符串即s本身。
5)s.join(seq):以s作为分隔符,将序列seq中的所有元素合并成一个新的字符串。
【例3.12 】 字符串的拆分和组合操作示例。
【程序代码】
s=″AAA,BBB,CCC,DDD″
print(″原字符串:{0}″.format(s))
print(″拆分成列表:{0}″.format(s.split(″,″)))
s=″AAA+BBB+CCC+DDD″
print(″原字符串:{0}″.format(s))
print(″拆分成列表:{0}″.format(s.split(″+″)))
s=″demo.py″
print(″原字符串:{0}″.format(s))
print(″拆分成元组:{0}″.format(s.partition(″.″)))
seq=[″AAA″,″BBB″,″CCC″,″DDD″]
print(″原列表:{0}″.format(seq))
print(″连接成字符串:{0}″.format(″-″.join(seq)))
【运行结果】
原字符串:AAA,BBB,CCC,DDD
拆分成列表:[′AAA′,′BBB′,′CCC′,′DDD′]
原字符串:AAA+BBB+CCC+DDD
拆分成列表:[′AAA′,′BBB′,′CCC′,′DDD′]
原字符串:demo.py
拆分成元组:(′demo′,′.′,′py′)
原列表:[′AAA′,′BBB′,′CCC′,′DDD′]连接成字符串:AAA-BBB-CCC-DDD
对字符串内容属于何种类型可以通过以下方法来测试。
1)s.isalnum():若字符串s中至少包含一个字符且全是字母或数字,则返回True,否则返回alse。
2)s.isalpha():若字符串s中至少包含一个字符且全是字母则返回True,否则返回False。
3)s.isdecimal():若字符串s只包含十进制数字则返回True,否则返回False。
4)s.isdigit():若字符串s只包含数字则返回True,否则返回False。
5)s.islower():若字符串s中至少包含一个字符且全是小写字母,则返回True,否则返回False。
6)s.isnumeric():若字符串s中只包含数字字符,则返回True,否则返回False。
7)s.isspace():若字符串s中只包含空格,则返回True,否则返回False。
8)s.istitle():若字符串s的内容首字母为大写字母,则返回True,否则返回False。
9)s.isupper():若字符串s中至少包含一个字符且全是大写字母则返回True,否则返回False。
【例3.13 】 字符串内容测试操作示例。
【程序代码】
s=″123456ABCDEFG″
print(″\″{0}\″全是字母或数字吗?{1}″.format(s,s.isalnum()))
s=″123456ABCDEFG″
print(″\″{0}\″全是字母吗?{1}″.format(s,s.isalpha()))
s=″1234567890″
print(″\″{0}\″全是数字吗?{1}″.format(s,s.isdigit()))
s=″Python″
print(″\″{0}\″全是小写字母?{1}″.format(s,s.islower()))
print(″\″{0}\″全是大写字母?{1}″.format(s,s.isupper()))
print(″\″{0}\″是首字母大写?{1}″.format(s,s.istitle()))
【运行结果】
″123456ABCDEFG″全是字母或数字吗?True
″123456ABCDEFG″全是字母吗?False
″1234567890″全是数字吗?True
″Python″全是小写字母?False
″Python″全是大写字母?False
″Python″是首字母大写?True