字符串操作
1. 获取字符串长度
1. 1 len(str)
: 用于指定要进行长度统计的字符串。
x = 'abcdef'
len(x) # out: 6
1. 2 获取字符串的字节数 : len(str.encode())
在 Python 中,不同的字符所占的字节数不同,数字、英文字母、小数点、下划线以及空格,各占一个字节,而一个汉字可能占 2~4 个字节,具体占多少个,取决于采用的编码方式。
汉字在 GBK/GB2312 编码中占用 2 个字节,而在 UTF-8 编码中一般占用 3 个字节。
获取采用 UTF-8 编码的字符串的长度
str1 = "人生苦短,我用Python"
len(str1.encode()) # out: 27
获取采用 GBK 编码的字符串的长度
str2 = "人生苦短,我用Python"
len(str2.encode('gbk')) # out: 20
2. 截取字符串(字符串切片)方法
2. 1 获取单个字符
语法格式:str_name[index]
str_name 表示字符串名字,index 表示索引值。
Python 允许从字符串的两端使用索引:
- 当以字符串的左端(字符串的开头)为起点时,索引是从 0 开始计数的
- 当以字符串的右端(字符串的末尾)为起点时,索引是从 -1 开始计数的
x = 'abcdefg'
# 获取索引为3的字符
print(x[3]) # out: d
# 从右往左获取索引为6的字符
print(x[-6]) # out: b
2. 2 获取多个字符(字符串截去/字符串切片)
语法格式:str_name[start : end : step]
- start:表示要截取的第一个字符所在的索引(包含该字符)。如果不指定,默认为 0,即字符串的开头截取;
- end:表示要截取的最后一个字符所在的索引(不包含该字符)。如果不指定,默认为字符串的长度;
- step:表示切片的步长,如果省略,则默认为1,当省略该值时,最后一个冒号也可以省略。
str = "hello world!"
# 截取第2个字符
str[1] # out: 'e'
# 从第3个字符开始截取
str[2:] # out: 'llo world!'
# 到第4个字符结束
str[:4] # out: 'hell'
# 截取1~5的字符
str[1:5] # out: 'ello'
# 截取最后一个字符
str[-1] # out: '!'
# 从第2个字符开始~倒数第二个结束
str[2:-2] # out: 'llo worl'
3. 分割、合并及替换字符串方法
3. 1 split()
方法:分割字符串(返回一个列表)
语法格式:str.split(sep, maxsplit)
sep:用于指定分隔符,可以包含多个字符。此参数默认为 None,表示所有空字符,包括空格(默认)、换行符“\n”、制表符“\t”等。当字符串中有连续的空格或其他空字符时,都会被视为一个分隔符对字符串进行分割。
maxsplit:可选参数,用于指定分割的次数,最后列表中子串的个数最多为maxsplit+1。如果不指定或者指定为 -1,则表示分割次数没有限制。
如果不指定 sep 参数,那么也不能指定 maxsplit 参数。
str = "i am a good boy!"
str.split() # 采用默认分割符进行分割
# out: ['i', 'am', 'a', 'good', 'boy!']
str.split(" ") # 采用空格进行分割
# out: ['i', 'am', 'a', 'good', 'boy!']
str.split(" ", 3) # 采用空格进行分割,并且只分割前3个
# out: ['i', 'am', 'a', 'good boy!']
3. 2 join()
方法:合并字符串
语法格式:new_str = str.join(iterable)
iterable:做合并操作的源字符串数据,允许以列表、元组等形式提供
# 将列表中的字符串合并成一个字符串。
list = ['console', 'log(dir)']
'.'.join(list) # out: console.log(dir)
# 将元组中的字符串合并成一个字符串。
dir = ('', 'usr', 'bin', 'env')
type(dir) # out: <class 'tuple'>
'/'.join(dir) # out: /usr/bin/env
3. 3 replace()
方法:替换字符串
语法格式:new_str = str.replace(old, new[, max])
old -- 将被替换的子字符串。
new -- 新字符串,用于替换old子字符串。
max -- 可选字符串, 替换不超过 max 次
str = 'hello world'
str.replace('world', 'python') # out: 'hello python'
str1 = 'hello-world'
str1.replace('-', '') # out: 'helloworld'
str1.replace('-', ' ') # out: 'hello world'
4. 检索字符串方法
str:表示原字符串;
sub:表示要检索的字符串;
start:指定检索的起始位置,也就是从什么位置开始检测。如果不指定,默认从头开始检索;
end:指定检索的终止位置,如果不指定,则表示一直检索到结尾。
注意:范围都是左闭右开
4. 1 count()
方法
语法格式:str.count(sub[,start[,end]])
作用:用于检索指定字符串在另一个字符串中出现的次数,如果检索的字符串不存在则返回0,否则返回出现的次数。
str = "abcdefga"
str.count('a') # out: 2
str = "abcadebfgc"
str.count('b', 1) # out: 2
str.count('b', 2) # out: 1
str = "abcadebfgc"
str.count('a', 0, -3) # out: 2
str.count('c', 3, -4) # out: 0
4. 2 find()
方法
语法格式:str.find(sub[,start[,end]])
作用:检索是否包含指定的字符串,如果检索的字符串不存在则返回-1,否则返回首次出现该字符串时的索引。
str = "abcdefga"
str.find('a') # out: 0
str = "abcadebfgc"
str.find('b', 1) # out: 1
str.find('b', 2) # out: 6
str = "abcadebfgc"
str.find('ab', 0, -3) # out: 0
str.find('c', 3, -4) # out: -1
4. 3 index()
方法
语法格式:str.index(sub[,start[,end]])
作用:和find方法类似,也用于检索是否包含指定的字符串,使用index方法,当指定的字符串不存在时会抛异常。
str = "hello world!"
str.index('w') # out: 6
'''
index()和find()的区别:
index(): 指定的字符串不存在时会抛异常
find(): 检索的字符串不存在则返回-1
'''
str.index('m') # 报错
str.find('m') # -1
4. 4 startswith()
方法
语法格式:str.startswith(prefix[, start[, end]])
作用:检索字符串是否以指定的字符串开头,如果是则返回true,否则返回false。
str = "hello world!"
str.startswith('hello') # out: True
str.startswith('hi') # out: False
4. 5 endswith()
方法
语法格式:str.endswith(prefix[, start[, end]])
作用:检索字符串是否以指定的字符串结尾,如果是则返回true,否则返回false。
str = "hello world!"
str.endswith('world!') # out: True
str.endswith('ha') # out: False
5.格式化字符串
语法格式:str.format(args)
str : 指定字符串的显示样式
args : 指定要进行格式转换的项,如果有多项,之间有逗号进行分割。
学习 format()
方法的难点,在于搞清楚 str 显示样式的书写格式。在创建显示样式模板时,需要使用{}
和:
来指定占位符,其完整的语法格式为:
{ [index][ : [ [fill] align] [sign] [#] [width] [.precision] [type] ] }
注意,格式中用 [ ] 括起来的参数都是可选参数,即可以使用,也可以不使用。各个参数的含义如下:
index:指定:后边设置的格式要作用到 args 中第几个数据,数据的索引值从 0 开始。如果省略此选项,则会根据 args 中数据的先后顺序自动分配。
fill:指定空白处填充的字符。注意,当填充字符为逗号(,)且作用于整数或浮点数时,该整数(或浮点数)会以逗号分隔的形式输出,例如(1000000会输出 1,000,000)。
align:指定数据的对齐方式,具体的对齐方式如表 1 所示。
表 1 align 参数及含义
align | 含义 |
---|---|
< | 数据左对齐。 |
> | 数据右对齐。 |
= | 数据右对齐,同时将符号放置在填充内容的最左侧,该选项只对数字类型有效。 |
^ | 数据居中,此选项需和 width 参数一起使用。 |
- sign:指定有无符号数,此参数的值以及对应的含义如表 2 所示。
表 2 sign 参数以含义
sign参数 | 含义 |
---|---|
+ | 正数前加正号,负数前加负号。 |
- | 正数前不加正号,负数前加负号。 |
空格 | 正数前加空格,负数前加负号。 |
# | 对于二进制数、八进制数和十六进制数,使用此参数,各进制数前会分别显示 0b、0o、0x前缀;反之则不显示前缀。 |
- width:指定输出数据时所占的宽度。
- .precision:指定保留的小数位数。
- type:指定输出数据的具体类型,如表 3 所示。
表 3 type 占位符类型及含义
type类型值 | 含义 |
---|---|
s | 对字符串类型格式化。 |
d | 十进制整数。 |
c | 将十进制整数自动转换成对应的 Unicode 字符。 |
e 或者 E | 转换成科学计数法后,再格式化输出。 |
g 或 G | 自动在 e 和 f(或 E 和 F)中切换。 |
b | 将十进制数自动转换成二进制表示,再格式化输出。 |
o | 将十进制数自动转换成八进制表示,再格式化输出。 |
x 或者 X | 将十进制数自动转换成十六进制表示,再格式化输出。 |
f 或者 F | 转换为浮点数(默认小数点后保留 6 位),再格式化输出。 |
% | 显示百分比(默认显示小数点后 6 位)。 |
案例:
在实际开发中,数值类型有多种显示需求,比如货币形式、百分比形式等,使用 format() 方法可以将数值格式化为不同的形式。
# 以货币形式显示
print("货币形式:{:,d}".format(1000000))
# out: 货币形式:1,000,000
# 科学计数法表示
print("科学计数法:{:E}".format(1200.12))
# out: 科学计数法:1.200120E+03
# 以十六进制表示
print("100的十六进制:{:#x}".format(100))
# out: 100的十六进制:0x64
# 输出百分比形式
print("0.01的百分比表示:{:.0%}".format(0.01))
# out: 0.01的百分比表示:1%
6.去除字符串中的空格以及特殊字符
开发中,我们会遇到这样的需求,字符串前后(左右侧)不允许出现空格和特殊字符或者将用户输入的字符串中误输入的空格去除掉。这时我们就需要用到strip函数。
6. 1 strip()
方法
语法格式 : str.strip([chars])
作用:去除字符串前后(左右侧)的空格或特殊字符
str1 = " hello world! "
str1.strip() # out: 'hello world!'
str2 = "#hello world#@#"
str2.strip('#')
# out: 'hello world#@'
str3 = "@hello world!@."
str3.strip('@.') # out: 'hello world!'
6.2 lstrip()
方法
语法格式 : str.lstrip([chars])
作用:去除字符串前面(左侧)的空格或特殊字符
str1 = " hello world! "
str1.lstrip() # out: 'hello world! '
str2 = "#hello world#@#"
str2.lstrip('#')
# out: 'hello world#@#'
str3 = "@.hello world!@."
str3.lstrip('@.') # out: 'hello world!@.'
6. 3 rstrip()
方法
语法格式 : str.rstrip([chars])
作用:去除字符串后面(右侧)的空格或特殊字符
str1 = " hello world! "
str1.rstrip() # out: ' hello world!'
str2 = "#hello world#@#"
str2.rstrip('#')
# out: '#hello world#@'
str3 = "@.hello world!@."
str3.rstrip('@.') # out: '@.hello world!'
7.字符串的大小写转换
7.1 str.lower()
作用:将字符串中的大写字母转换为小写字母
str = "Hello World!"
str.lower() # out: 'hello world!'
7.2 str.upper()
作用:将字符串中的小写字母转换为大写字母
str = "Hello World!"
str.upper() # out: 'HELLO WORLD!'
7.3 str.capitalize()
作用:将字符串中的首字母变成大写
str = "Hello World!"
str.capitalize() # out: 'Hello world!'
7.4 str.title()
作用:将字符串中的每个单词的首字母变成大写
str="hello world!"
str.title() # out: 'Hello World!'
7.5 str.swapcase()
作用:将字符串中的字母大小写互换(即小写字母转换为大写字母,大写字母转换为小写字母)
str = "Hello World!"
str.swapcase() # out: 'hELLO wORLD!'