字符串的意思就是“一串字符”,比如“hello world”就是一个字符串,Pyhton要求字符串必须使用引号括起来,单引号和双引号都可以,只要两边的引号能配对就可以。
1字符串的定义
在上面也说了,在Python中,用引号包起的都被称为字符串,其中引号可以是单引号(‘’),也可以是双引号(“”)和三引号(''' ''' 或""" """)
name = 'zhang san'
str = 'good morning!'
print(str,name)
# 结果:goodmorning! zhang san
2 字符串的格式化输出
在很多时候,我们需要在字符串中放置变量,然后用变量的值替换,在这种情况下就要用到字符串格式化输出,python中字符串的格式化输出有两种方式,一种是%,另一种是使用·format()·函数实现字符串格式化输出。
2.1 使用%() 实现字符串格式化输出
具体使用方法如下:
name = 'zhang san'
age = 22
job = 'student'
str = "my name is %s,I'm %d years old,I'm a %s." %(name,age,job)
print(str)
# 结果:my name is zhang san,I'm 22 years old,I'm a student.
其中%s代表字符串变量,%d代表整数型变量。
常见的格式化字符:
| 格式 | 描述 |
|---|---|
| %% | 百分号标记 ,就是输出一个% |
| %c | 字符及其ASCII码 |
| %s | 字符串 |
| %d | 有符号整数(十进制) |
| %u | 无符号整数(十进制) |
| %o | 无符号整数(八进制) |
| %x | 无符号整数(十六进制) |
| %X | 无符号整数(十六进制大写字符) |
| %e | 浮点数字(科学计数法) |
| %E | 浮点数字(科学计数法,用E代替e) |
| %f | 浮点数字(用小数点符号) |
| %g | 浮点数字(根据值的大小采用%e或%f) |
| %G | 浮点数字(类似于%g) |
| %p | 指针(用十六进制打印值的内存地址) |
| %n | 存储输出字符的数量放进参数列表的下一个变量中 |
其中,最常用的为%s,%d,%f,%e。
2.2 使用format()函数实现字符串格式化输出
使用方式是将字符串中要替换的位置用大括号,并在大括号里放置参数。参数可以是变量名也可以是数字,变量名的话,对应format()函数的参数名,如果是数字的话,对应format()函数的参数的参数顺序。
name = 'zhang san'
age = 22
job = 'student'
# 方式一:
str = "my name is {name},I'm {age} years old,I'm a {job}." .format(name=name, age = age, job = job)
print(str)
# 结果: my name is zhang san,I'm 22 years old,I'm a zhang san.</pre>
# 方式二:
str = "my name is {0},I'm {1} years old,I'm a {2}." .format(name, age, job)
print(str)
# 结果: my name is zhang san,I'm 22 years old,I'm a zhang san.
format()函数还有一些其他用法:
age = 25
name = 'Caroline'
# 小数点后三位
print('{0:.3} is a decimal. '.format(1/3))
# 结果:0.333 is a decimal.
# 使用_补齐空位
print('{0:_^11} is a 11 length. '.format(name))
# 结果:_Caroline__ is a 11 length.
# 调用方法
print('My name is {0.name}'.format(open('out.txt', 'w')))
# 结果:My name is out.txt
# 指定宽度
print('My name is {0:8}.'.format('Fred'))
# 结果:My name is Fred
3 获取用户输入
input()函数来获取用户的输入,获取到的内容都是字符串格式
msg = input("请输入你的值:")
print("你输入的值是:",msg,"格式为:",type(msg))
输出:

4 转义字符
转义转义,顾名思义,就是转换含义,通俗的说就是改变原来的意思。
比如字符串内容本身包含了单引号或双引号,像Let's go.。如果用单引号括起来就是这样'Let's go.',在python中就会报错,此时就需要进行特殊处理。
- 使用不同的引号将字符串括起来,比如单引号改为双引号
- 对引号进行转义
Python用反斜杠(\)来转义字符,上面的例子就可以写成'Let\'s go.',就不会报错了。
Python中的转义字符见下表:
| 转义字符 | 描述 |
|---|---|
| (在行尾时) | 续行符 |
| \ | 反斜杠符号 |
| ' | 单引号 |
| " | 双引号 |
| \a | 响铃 |
| \b | 退格(Backspace) |
| \e | 转义 |
| \000 | 空 |
| \n | 换行 |
| \v | 纵向制表符 |
| \t | 横向制表符 |
| \r | 回车 |
| \f | 换页 |
| \oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
| \xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
| \other | 其它的字符以普通格式输出 |
5 字符串常用操作方法
对字符串的操作,常用的操作主要包括查看字符串长度,索引,切片,分割和拼接字符串,移除字符串两侧的空格,字符串子串的查找和替换等操作。
5.1 查看字符串长度
用len()函数查看字符串的长度
a = 'zhang san'
len(a)
# 结果:9
b = "你好"
len(b)
# 结果:2
由上面两个例子可以看出,len()函数查看的是字符串中字符的数量,该函数还可以查看列表,元祖,字典中的长度,后面会提到。
5.2 字符串拼接
Python使用加号(+)来合并字符串。这种合并字符串的方法称为拼接
'my' +' '+ 'name' + ' '+ 'is' + ' ' + 'zhangsan'
# 结果: 'my name is zhangsan'
5.3 截取字符串
单个字符串的截取用索引,多个字符串的截取用切片。
5.3.1 字符串的索引
Python有两种索引方式:
- 从前往后的正向索引:索引从0开始,有m个字符长度的字符串,索引值是0~m-1(计算机很多都是从0开始标序号的)
- 从后往前的负数索引:索引从-1开始,有m个字符长度的字符串,索引值是-1~-m
name = 'zhangsan'
name[0]
# 结果:'z'
name = 'zhangsan'
name[-3]
# 结果: 's'
5.3.2 字符串的切片
切片:顾名思义,就是把东西切成片,如果把字符串看成一根黄瓜,切片就是切出一个黄瓜片,黄瓜片的厚度就代表了切出来的字符串的长度。
说的专业一点切片就是,取出字符串中的子串!
我们来想一下,如果要从一根黄瓜里面切出一个黄瓜片,一般是要切两刀,在黄瓜的某个位置切一刀,然后根据所需黄瓜片的厚度,在另外的一个位置再切一刀,黄瓜片就产生了。当然,如果我们从头开始切,那第一刀就不用切了,只要根据想要黄瓜片的厚度在相应位置切一刀就可以产生一个黄瓜片,同理,我们想要黄瓜的结尾部分,只要切一刀就可以了,后面的部分也是一个黄瓜片。所以,切片的语法就类似我们切黄瓜片,需要三个参数,第一刀的位置,第二刀的位置,每刀切多厚。
切片标准的写法是用两个冒号分割三个数字,代表的意思分别是:
- 第一个数字表示切片的开始位置(索引),可以为正值也可以为负值(参考字符串索引的用法),可以省略,若省略代表为0,即索引为0开始取。
- 第二个数字表示切片的截至位置,但是不包括这个位置的,也就是切到它的前一个位置结束(索引),可以为正值也可以为负值,可以省略,省略代表取到最后。
- 第三个表示切片的步长,当省略步长时候,默认为1,可以省略,省略后冒号也可以省略,也可以为负数,代表逆序取。
三个数全部省略,表示取字符串的全部,相当于没切。
name = 'zhang san'
name[1:4] # 从第2个位置切到第4个位置,不包含第四个位置。
# 结果:'han'
name[1:4:2] # 从第2个位置切到第4个位置,步长为2
# 结果:'hn'
name[1:] # 从第2个位置切到最后
# 结果:'hang san'
name[::] # 切出所有
# 结果:'zhang san'
name[::2] # 切出所有,步长为2
# 结果: 'zagsn'
name[::-1] # 逆序字符串
# 结果: 'nas gnahz'
name[:5] # 切出前5个字符
# 结果:'zhang'
5.3.3 其他字符串截取方法
splitlines(self, keepends=False)方法根据换行符进行分割,结果返回一个列表,关于列表的详细说明,请参考列表数据格式。
name = """zhangsan
lisi
wangwu
"""
print(name.splitlines())
# 结果: ['zhangsan ', 'lisi ', 'wangwu']
5.4 大小写相关操作
大小写操作,只针对于英文的字母的操作,对汉字是没有效果的。
-
title(self)方法以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。 -
upper(self)方法将字符串改为全部大写 -
lower(self)方法将字符串改为全部小写 -
capitalize(self)方法将首字母变为大写,即字符串的第一个字母。 -
swapcase(self)方法字符串大写变小写,小写变大写
name = 'zhang san'
job = 'IT'
print(name.title())
# 结果:Zhang San
print(name.upper())
# 结果:ZHANG SAN
print(job.lower())
# 结果:it
print(name.capitalize())
# 结果:Zhang san
print(name.title().swapcase())
# 结果:zHANG sAN
5.5 判断字符串是否为某种格式
-
islower(self)方法:判断字符串是否为小写 -
isspace(self)方法:判断字符串是否为空字符串 -
istitle(self)方法:判断字符串是否为标题格式的字符串 -
isupper(self)方法: 判断字符串是否全为大写 -
startswith(self, prefix, start=None, end=None)方法:判断字符串是否起始 -
isalnum(self)方法: 是否是字母和数字 -
isalpha(self)方法: 是否是字母 -
isdigit(self)方法: 是否是数字 -
translate(self, table, deletechars=None)方法: 转换,需要先做一个对应表,最后一个表示删除字符集合。
name = 'zhang san'
name.islower()
# 结果:True
5.6 使用制表符或换行符来添加空白
- 要在字符串中添加制表符,可使用字符组合\t
- 要在字符串中添加换行符,可使用字符组合\n
print('hello,zhang san')
print('--------------------')
print('hello,\nzhang san')
print('--------------------')
print('hello,\tzhang san')
结果:
hello,zhang san
--------------------
hello,
zhang san
--------------------
hello, zhang san
5.7 将字符串填充为指定的长度
-
center(self, width, fillchar=None)将字符串填充为指定的长度,并将字符串置于中间,fillchar参数指定填充的符号,默认为空 -
ljust(self, width, fillchar=None)将字符串填充为指定的长度,并将字符串置于左侧,fillchar参数指定填充的符号,默认为空 -
rjust(self, width, fillchar=None)将字符串填充为指定的长度,并将字符串置于右侧,fillchar参数指定填充的符号,默认为空
name = 'zhangsan'
print(name.center(50,'-'))
print(name.center(50))
print(name.ljust(50,'*'))
print(name.rjust(50,'*'))
结果:
---------------------zhangsan---------------------
zhangsan
zhangsan******************************************
******************************************zhangsan
zfill(self, width)方法返回指定长度的字符串,原字符串右对齐,不满指定的长度,在前面填充0。
name = 'zhangsan'
print(name.zfill(20))
# 结果:000000000000zhangsan
5.8 删除空白
- 要确保字符串末尾没有空白,可使用方法
rstrip();并不改变原变量值。 - 要确保字符串开头没有空白,可使用方法
lstrip()。 - 要同时确保字符串开头和末尾没有空白,可使用方法
strip()。
name = ' zhang san '
print('|' + name+'|',len(name))
print('|' + name.rstrip()+'|',len(name.rstrip()))
print('|' + name.lstrip()+'|',len(name.lstrip()))
print('|' + name.strip()+'|',len(name.strip()))
结果:
| zhang san | 17
| zhang san| 13
|zhang san | 13
|zhang san| 9
5.9 计算子序列个数
count()方法用于统计字符串中某个子串的个数。
name = 'zhangsan'
# 计算变量name中 a 的个数
name.count('a')
# 结果:2
从索引为3的位置往后开始计算,包含索引位置。
name = 'zhangsan'
name.count('a',3)
# 结果:1
从索引为3开始计算,计算到索引为6,不包含索引为6 的位置。
name = 'zhangsan'
name.count('a',3,6)
# 结果:0
5.10 字符串是否以某个子串结束
endswith(self, suffix, start=None, end=None)方法: 判断字符串是否以 xxx 结束
name = 'zhangsan'
name.endswith('an')
# 结果:True
5.11 寻找子串位置
用于寻找字符串中的子串的索引位置,如果有多个以第一个找到为准。结果从0开始,如果没找到返回-1
-
find(self, sub, start=None, end=None)方法: 从左侧开始找 -
rfind(self, sub, start=None, end=None)方法: 从右侧开始找
name = 'zhangsan'
name.find('a')
# 结果: 2
name = 'zhangsan'
name.find('saw')
# 结果:-1
name= 'zhangsan'
name.rfind('a')
# 结果:6
5.12 查找子串位置
查找子序列位置,如果没找到,报错
-
index(self, sub, start=None, end=None)方法: 子序列位置,如果没找到,报错 -
rindex(self, sub, start=None, end=None)方法: 从右侧开始找
name= 'zhangsan'
name.index('an')
# 结果: 2
name= 'zhang san'
name.rindex('an')
#结果:7
5.13 替换字串
replace(self, old, new, count=None)方法: 将字符串中的子串替换为另外的子串
name= 'zhang san'
name.replace('a','e')
结果: 'zheng sen'
5.14 连接字符串
join(self, iterable)方法将传入的列表中的元素连接在一起,用逗号隔开
name = ','
name.join(['lisi','wangwu','maliu'])
# 结果: 'lisi,wangwu,maliu'
5.15 分割字符串
partition(self, sep)
根据指定的分隔符将字符串分割为前,中,后三部分,一般为指定的分隔符前面为1部分,分隔符为一部分,剩下的为一部分 ,从左面开始"""
name = 'zhangsan,lisi,wangwu,maliu'
name.partition("a")
# 结果: ('zh', 'a', 'ngsan,lisi,wangwu,maliu')
rpartition(self, sep)根据指定的分隔符将字符串分割为前,中,后三部分,一般为指定的分隔符前面为1部分,分隔符为一部分,剩下的为一部分 ,从右面开始 """
split(self, sep=None, maxsplit=None)分割,默认分割符为空格,可指定分隔符, maxsplit最多分割几次,从左侧开始
name = """zhangsan,lisi,wangwu"""
name.split(sep = 'a',maxsplit=1)
# 结果: ['zh', 'ngsan,lisi,wangwu']
rsplit(self, sep=None, maxsplit=None)分割,默认分割符为空格,可指定分隔符, maxsplit最多分割几次,从右侧开始
name = """zhangsan,lisi,wangwu"""
name.rsplit(sep = 'a',maxsplit=1)
# 结果:['zhangsan,lisi,w', 'ngwu']
6 字符串编码问题
将字符串解码为unicode格式
decode(self, encoding=None, errors=None):
将unicode格式的字符串编码为指定的编码格式
encode(self, encoding=None, errors=None)
将tab转换成空格,默认一个tab转换成3个空格
expandtabs(self, tabsize=None)
name = 'zhang\tsan'
names = name.expandtabs()
print(names)
# 结果: 'zhang san'