Python字符串
字符串是Python中最常见的数据类型,它包含在一对双引号(” “)或单引号(’ ‘)中。单引号和双引号没有任何区别。
字符串概述
一个英文字母、数字或符号称为字符,“字符串”从字面上的意思来看,可以解释成“把字符一个一个串起来”。字符串的用途相当广泛,它可以比数值性的数据表达出更多的信息,例如一个人的名字、一首歌的歌词,甚至是一整个段落的文字。在程序设计的世界中,操作字符串只是基本功,Python中的字符串有多种表示方式。
字符串是类型为string的对象,通过将一连串字符放在单引号或双引号中来表示,内部函数str()可以将数据转换为字符串。string类型提供的字符串方法(method)用于处理字符串对象。
创建字符串
字符串是由一连串的字符所组成的,将一连串字符用一对单引号或双引号引起来就是一个字符串,例如:
"13579"
"1+2"
"Hello, how are you?"
"I'm all right, but it's raining."
'I\'m all right, but it\'s raining.'
用来引住字符串的双引号与单引号可以交替使用,上例中第4行字符串由双引号引住,第5行字符串则用单引号引住,然而第5行字符串中已经有单引号,就要避免使用单引号引住字符串,如果遇到只能使用单引号的情况,可以在字符串中的单引号之前加上转义字符“\”。
如果输出字符串时想要分行显示,可以在要换行的地方加入“\n”,例如:
str1 = "Hello!\nHow are you?"
print(str1)
如果要将字符串赋值给特定的变量,可以使用“=”赋值运算符。Python字符串创建的方式如下:
wordA = '' #当单引号之内没有任何字符时,它就是一个空字符串
wordB = 'P' #单个字符
wordC ="Python" #创建字符串时,也可以使用双引号
当我们想直接将数值数据转换为字符串时,可以调用内建函数str(),例如:
str() #输出空字符串''
str(123) #将数字转为字符串'123'
当字符串较长时,也可以使用“\”字符将过长的字符串拆成两行,例如:
wordD ="What's wrong with you? \
Nothing!"
在Python语言中,也可以使用三重单引号或双引号来固定多行字符串的输出模式,例如:
>>> title="""
祝
2018
新年快乐"""
>>> print(title)
祝
2018
新年快乐
>>>
认识转义字符
字符串中有一些特殊的字符无法从键盘输入或者该字符已经被定义用作其他用途,如果要在字符串中使用这些字符,就必须加上转义字符。例如,以单引号引起来的字符串,如果在字符串内容中又遇到了单引号字符,就必须以“\”进行转义,避免被误认为字符串结束的单引号。
转义字符通常使用反斜线“\”,请看以下实例:
str1 = 'it\'s raining.'
当解释器遇到反斜线时,就知道下一个字符必须另外处理,不会将它视为字符串结尾的单引号。另外,还有一些换行字符、制表符等无法由键盘输入,也可以用转义字符来处理。
转义字符“\”本身还有另一个用途,就是当程序代码太长时,只要在该行末端加一个反斜线,可以换行继续编写。
例如,以下程序语句中,在print语句中加上转义字符“\”就可以换到下一行继续编写了。
a = "Beautiful"
b = len(a)
print("{}有{}个字符".\
format(a, b))
参数格式化输出
参数格式化输出就是将数据按所指定的格式输出,使其更易于阅读。在Python语言中,可以调用format()函数来格式化数据,例如:
num=1.41421
print("num= {:.5f}".format(num)) # num= 1.41421
{:.5f}表示要将数值格式化成保留小数点后5位。
num=1.41421
print("num= {:7.3f}".format(num)) # num= 1.414
其中,{:7.3f}表示数字总长度为7的浮点数,且小数点后保留3位,此处的小数点符号本身也计算在总长度内。从执行结果来看,总长度为7,不足的部分会在数值前补足空格。
此外,str.format()方法还可以置换字段名,不过必须使用大括号“{}”“包裹”要置换的字段名。注意,大括号“{}”的下标编号从零开始,例如:
print('{0}{1}'.format('num = ', 1.41421))
# 输出num= 1.41421
上述语句表示字符串“num=”会带入字段名1({0}),而数值1.41421则会带入字段名2({1}),最后才会输出“num=1.41421”。
我们还可以在大括号中直接指定要输出的参数名称,语法如下:
{字段名}
下例说明大括号“{}”中的字段名如何配合format()方法来使用。
# 四月有30天
print('{month}月有{day}天'\
.format(month ='四', day = 30))
上述大括号“{}”中使用了两个关键字参数,采用“变量=设置值”的用法,所以“month”会被变量值“四”取代,同样“day”会被“30”取代。
最后,我们介绍调用format()方法转换成指定格式,其语法为:
{字段名 : 转换为指定格式}
下面的范例程序调用format()方法配合format-spec(格式规格)进行格式化输出,同时也使用了%格式化字符串。
print('PI = %10.5f'%(3.14159)) #输出5位小数
print('PI = {0:010f}'.format(3.14159)) #前面补0,字段宽度为10
radius = (3.14159) * 20 *20 #计算圆面积
area = int(radius) #将半径转换成整数
print('靠右 = {0:=>12d}'.format(area)) #*字符填满
print('居中 = {0:=^12d}'.format(area))
print('PI = {0:.5f}\n'
'圆面积 = {1:,.4f}'.format(3.14159, radius))
#圆面积加千位逗点
#圆面积以十进制数、十六进制数、二进制数输出
print('圆面积 = {0:d}, {0:#b}, {0:#x}'.format(area))
字符串下标与切片
字符串是由字符所组成的列表对象(类似于其他语言中的数组),如果想要获取字符串中的字符,有三种方式:
- 通过下标值(index,或称为索引值)来获取某个字符。
- 使用切片(slice)方法获取某段字符串。
- 调用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(切片),顾名思义就是从字符串中读取某一段字符串,字符串的字符具有顺序性,我们可以使用“[]”运算符来读取字符串中的单个字符或子字符串,这个操作被称为“切片”。格式如下:
字符串[起始下标:结束下标:间隔值]
对字符串进行“切片”时,如果不用间隔取值,就可以省略间隔值不写。
例如以下字符串切片运算:
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()方法可以按照指定分隔符将字符串分割为子字符串,并返回子字符串的列表。格式如下:
字符串.split(分隔符, 分割次数)
默认的分隔符为空字符串,包括空格符、换行符(\n)、制表符(\t)。调用split()方法分割字符串时,会将分割后的字符串以列表(list)返回。
范例程序如下:
str1 = "Do \none \nthing \nat a time!"
print( str1.split() )
print( str1.split(' ', 1 ) )
split()的作用是将字符串分割,而join()方法正好相反,它会把字符串串接起来。
字符串的常用运算符
在Python语言中,字符串可以通过串接运算符“+”将两个字符串串接起来。不过,字符串相加时,“+”两边都必须是字符串类型,如果是字符串与非字符串类型相加,必须先调用str()函数将非字符串类型转换为字符串类型再进行字符串相加运算,例如:
str1 = "Hello!" + "How are you?"
print(str1) #执行结果:Hello!How are you?
除了可以用“+”运算符进行字符串的串接操作外,也可以使用乘号“*”来重复字符串,例如:
str1 = "Hello!" * 3
print(str1) #执行结果:Hello!Hello!Hello!
比较运算符
前面提过比较运算符可以用来比较两个数值之间的大小关系,事实上,Python的任何对象都可以用来进行比较运算。Python字符串的大小比较是根据字符的Unicode值的大小进行比较的。例如,数字’0’~’9’的Unicode值小于大写字母’A’~’Z’,大写字母’A’~’Z’的Unicode值小于小写字母’a’~’z’。而汉字字符的Unicode值又大于刚才所举的数字字符及英文大小字母的例子。另外,比较表达式可以任意串联,例如,x<y<=z就相当于x<y and y<=z。
>>> '快乐' > 'Happy'
True
>>> 'Happy Birthday' < 'happy birthday'
True
>>> 'abc' > 'ABC' > '123'
True
>>> 'HAPPY' == 'happy'
False
in与not in运算符
in和not in只适用于序列对象,例如字符串、列表等。应用于字符串的in运算符可以用来检测指定的字符串是否在另一个字符串之中。同理,not in运算符可以用来检测指定的字符串是否不存在于另一个字符串之中,例如:
>>> str1 = "happy"
>>> "y" in str1
True
>>> "0" in str1
False
>>> "0" not in str1
True
字符串的常用函数与方法
在编写程序的过程中要善用字符串函数,因为字符串函数非常重要而且很实用,由于与字符串有关的方法众多,有些方法来自于对象(object),有些方法则是由类提供的属性和方法。声明了字符串变量之后,就表示实现了str()类,而它的方法都能被声明的字符串对象使用,通过“.”(dot)运算符来调用对象的方法。
常用的函数包括计算字符串长度、替换字符串、查找字符串,甚至是比较两个字符串的函数,等等。下面介绍Python提供的一些用于字符串的函数与方法。
计算字符串的长度——len()函数
len()是内建的函数,它会返回字符串的长度,空格符、特殊字符和控制字符也会计算在内。
例如转义字符的字符长度是1:
s= "The first wealth is health\u266C"
print("{} 长度是{}".format(s, len(s)))
搜索特定字符串出现的次数——count()
在进行数据分析的时候常常需要计算特定字符串出现的次数,Python提供了count()方法,格式如下:
目标字符串.count(特定字符串[, 开始下标[, 结束下标]])
开始下标与结束下标可省略,表示搜索整个目标字符串。
搜索特定字符串出现的次数
str1="Never say Never! Never say Impossible!"
str2="浪花有意千重雪,桃李无言一队春。\n一壶酒,一竿纶,世上如侬有几人?"
s1=str1.count("Never",15)
s2=str1.count("e",0,3)
s3=str2.count("一")
print("{}\n“Never”出现{}次,“e”出现{}次".format(str1,s1,s2))
print("\n{}\n“一”出现{}次".format(str2,s3))
删除字符串左右两边特定的字符——strip()、lstrip()、rstrip()
函数strip()用于删除字符串首尾的字符,lstrip()用于删除左边的字符,rstrip()用于删除右边的字符,三种方法的格式相同。
下面以strip()来进行说明:
字符串.strip([特定字符])
特定字符默认为空格符,特定字符可以输入多个,例如:
str1="Never say Never!"
s1=str1.strip("N!")
print(s1)
由于传入的参数是(“N!”),相当于要删除“N”与“!”,执行时会按序删除两端匹配的字符,直到没有匹配的字符为止,所以上面的范例分别删除了左边的“N”与右边的“!”字符。
字符串替换——replace()
函数replace()可以将字符串中的特定字符串替换成新的字符串,格式如下:
字符串.replace(原字符串, 新字符串[, 替换次数])
str= "Jennifer is a beautiful girl."
s=str.replace("Jennifer", "Joan")
str= "苹果可以做成苹果汁、苹果干、苹果色拉."
s=str.replace("苹果", "葡萄")
查找字符串——find()与index()
find()方法用来查找指定的字符或字符串,返回第一个找到该字符或字符串时的下标编号,同样以下标编号来设置开始和结束的查找范围,不过开始下标及结束下标可省略。语法如下:
str.find(字符或字符串[,开始下标[,结束下标]])
word = '''We all look forward to the annual ball
because it’s great time to dress up.'''
print(word)
print(word.find('all')) #寻找子字符串all,从下标编号0开始
print(word.find('all', 7)) #寻找子字符串all,从下标编号7开始
index()方法用来返回指定字符的下标值,所以它的用法和find()函数非常接近,同样以下标编号来设置开始和结束的范围,语法如下:
str.index(字符或字符串[,开始下标[,结束下标]])
其中,字符或字符串参数就是要寻找的字符或字符串,若未找到,则返回错误值ValueError,这项参数不可省略,不过开始下标及结束下标可省略,例如(参考范例程序strindex.py):
wd = ''' A very low one.
If you take away tipping,
you run risk of losing good service. '''
print('字符串:', wd)
print('字符串-you 下标值:', wd.find('you'))
print('找不到字符串:', wd.find('yov'))
print('字符串-one 下标值:', wd.index('one'))
print('找不到字符串', wd.index('services'))
find()方法未找到指定的子字符串会返回-1。
startswith()方法与endswith()方法
根据设置的范围判断指定的子字符串是否存在于原有字符串中,若存在,则返回True。startswith()方法用来对比前端的字符,endswith()方法则用来对比尾端的字符,其语法如下:
startswith(开头的字符[,开始下标[,结束下标]])
endswith(结尾的字符[,开始下标[,结束下标]])
- 开头的字符:表示字符串中开头的字符。
- 结尾的字符:表示字符串中结尾的字符。
开始下标、结束下标为可选项,可使用字符串切片的计算来设置要查询字符的下标值。
wd = 'Programming design'
print('字符串:', wd)
print('Prog?', wd.startswith('Prog')) #返回True
print('gram?', wd.startswith('gram', 0)) #返回False
print('de?', wd.startswith('de', 12)) #返回True
print('ign?', wd.endswith('ign')) #返回True
print('ing?', wd.endswith('ing', 0, 11)) #返回True