目录
一、字符串类型
二、字符串的常用操作
1.字符串拼接
2.计算字符串的长度
3.截取字符串
4.分割、合并字符串
4.1 分格字符串
4.2 多字符分割字符串
4.3 合并字符串
5.检索字符串
5.1 count()
5.2 index() 和rindex()
5.3 find()和rfind()
5.4 startswith()
5.5 endswith()
5.6 replace()
6. 去除字符
7.大小写转换
三、字符串格式化
1.%占位符格式化
2.format()格式化
2.1 基本格式
2.2 格式限定符
3.fstring()格式化
3.1 格式:
3.2 格式限定符
四、字符串编码
1.使用encode()方法编码
2.使用decode()方法解码
五、正则表达式
1.正则表达式字符
2.模式字符串
3.通过re模块使用正则表达式
3.1 re模块的基本方法
3.2 匹配字符串
3.2.1 使用match()方法进行匹配
3.2.2 Match对象
3.2.3 使用search()方法进行匹配
3.2.4 使用findall()方法进行匹配
3.3 替换字符串
3.4 使用正则表达式分割字符串
用来讲述python中关于字符串的操作,包括字符串操作,编码解码,正则表示式等。
如下是常用转义字符:
转义字符 | 说明 |
\ | 续行符 |
\n | 换行符 |
\0 | 空 |
\t | 水平制表符,用于横向跳到下一制表位 |
\" | 双引号 |
\' | 单引号 |
\\ | 一个反斜杠 |
\f |
换页 |
\0dd | 八进制数,dd代表的字符,如\012代表换行 |
\xhh | 十六进制,hh代表的字符,如\x0a代表换行 |
格式:
字符串1 + 字符串2
注意:
拼接的如果不是字符串就会报错,需要将其他类型先转换到字符串。
# _*_ coding:utf-8 _*_
str1 = "这是字符串1"
str2 = "这是字符串2"
num = 1000
print(str1 + 1000)
结果:
将数字转成字符串后就可以正常了。
# _*_ coding:utf-8 _*_
str1 = "这是字符串1"
str2 = "这是字符串2"
num = 1000
print(str1 + str(num))
结果:
类型 | 长度 |
字母A-Z,a-z | 1个字节 |
数字0-9 | 1个字节 |
.、*、空格的符号 | 1个字节 |
中文汉字 | 2~4字节 gbk格式占2个字节 utf-8格式占3个字节 |
示例:
# _*_ coding:gbk _*_
str1 = "人生苦短,我用python!"
print("gbk格式长度",len(str1))
print("utf-8格式长度",len(str1.encode())) #encode() 默认是utf-8格式
结果:
同序列一致,通过切片截取字符串。
格式:
[ start : end : step]
语法:
list = str.split(sep, maxsplit) #从左往右分割
list = str.rsplit(sep, maxsplit) #从右往左分割
list = str.splitlines(keepends = false) #以换行符“\n”分割
示例:
# _*_ coding:gbk _*_
str1 = "人生 苦短,我用 python!,今天 星期五,还没有 放假!"
print("字符串:",str1)
print("str1.split():",str1.split())
print("str1.split(" ",2):",str1.split(" ",2))
print("str1.split(","):",str1.split(","))
print("str1.split(",",1):",str1.split(",",2))
结果:
string自带的分割函数只能使用单一的字符串分割,若要使用多个字符串分割,可以使用re库的函数。
re.split(pattern, string[, maxsplit=0, flags=0])
语法:
stringnew = string.join(iterable)
示例:
# _*_ coding:gbk _*_
strlist = ["人生苦短","我天","今天星期五","还没有放假!"]
print("列表:",strlist)
print("\",\".join(strlist):",",".join(strlist))
结果:
str.count(sub[,start[.end]])
示例:
# _*_ coding:utf-8 _*_
str_temp = "我是个字符串,la la la"
print("string : ",str_temp)
print("str_temp.count(\"la\") : ", str_temp.count("la"))
print("str_temp.count(\"la\",0) : ", str_temp.count("la",0))
print("str_temp.count(\"la\",10) : ", str_temp.count("la",10))
print("str_temp.count(\"la\",10,12) : ", str_temp.count("la",10,12))
结果:
str.index(sub[,start[.end]]) #从左往右找
str.rindex(sub[,start[.end]]) #从右往左找
注意:当字符串找不到时,抛出ValueError错误。
str.find(sub[,start[.end]]) #从左往右找
str.rfind(sub[,start[.end]]) #从右往左找
注意:包含时返回sub的索引位置,否则返回-1.
str.startswith(prefix[, start[, end]])
判断字符串是否以prefix开头;
str.endswith(suffix[, start[, end]])
判断字符串是否以suffix为结尾;
str.replace(old, new[, count])
str.strip([chars]) # 从两边移除字符
str.lstrip([chars]) # 从左边移除字符
str.rstrip([chars]) # 从右边移除字符
默认移除空白(空格、制表符、换行符)。
str.lower() # 转换小写
str.upper() # 转换大写
三种格式化方式:
与C语言的格式化输出有点像,用%号占位
% flags width . precision typecode
示例:
# _*_ coding:utf-8 _*_
num = 3.141592654
print("%20.2f"%num)
print("%0d"%num)
print("%10.2f%%"%(num/100))
结果:
string.format()
示例:
# _*_ coding:utf-8 _*_
print('"今天是星期{},天气{}".format("天","晴"):',"今天是星期{},天气{}".format("天","晴"))
print('"今天是星期{0},天气{1}".format("天","晴"):',"今天是星期{0},天气{1}".format("天","晴"))
print('"今天是星期{0},天气{0}".format("天","晴"):',"今天是星期{0},天气{0}".format("天","晴"))
print('"今天是星期{day},天气{weather}".format(day = "天", weather = "晴"):',"今天是星期{day},天气{weather}".format(day = "天", weather = "晴"))
结果:
其中{}中的可以结合格式限定符设置各种格式,用{:}声明格式:
示例:
# _*_ coding:utf-8 _*_
num = 1314.520
print('num:',"{:^10}".format(num))
print('"{:^10}".format(num):',"{:^10}".format(num))
print('"{:<10}".format(num):',"{:<10}".format(num))
print('"{:>10}".format(num):',"{:>10}".format(num))
print('"{:_^10}".format(num):',"{:_^10}".format(num))
print('"{:_<10}".format(num):',"{:_<10}".format(num))
print('"{:_>10}".format(num):',"{:_>10}".format(num))
print('"{:#^10}".format(num):',"{:#^10}".format(num))
print('"{:#<10}".format(num):',"{:#<10}".format(num))
print('"{:#>10}".format(num):',"{:#>10}".format(num))
print('"{:b}".format(int(num)):',"{:b}".format(int(num)))
print('"{:d}".format(int(num)):',"{:d}".format(int(num)))
print('"{:o}".format(int(num)):',"{:o}".format(int(num)))
print('"{:x}".format(int(num)):',"{:x}".format(int(num)))
print('"{:2.2f}".format(num):',"{:2.2f}".format(num))
print('"{:10.10f}".format(num):',"{:10.10f}".format(num))
print('"{:_^10.10f}".format(num):',"{:_^20.2f}".format(num))
# 结果如下:
num: 1314.52
"{:^10}".format(num): 1314.52
"{:<10}".format(num): 1314.52
"{:>10}".format(num): 1314.52
"{:_^10}".format(num): _1314.52__
"{:_<10}".format(num): 1314.52___
"{:_>10}".format(num): ___1314.52
"{:#^10}".format(num): #1314.52##
"{:#<10}".format(num): 1314.52###
"{:#>10}".format(num): ###1314.52
"{:b}".format(int(num)): 10100100010
"{:d}".format(int(num)): 1314
"{:o}".format(int(num)): 2442
"{:x}".format(int(num)): 522
"{:2.2f}".format(num): 1314.52
"{:10.10f}".format(num): 1314.5200000000
"{:_^10.10f}".format(num): ______1314.52_______
f"字符串{}" 或 F”字符串{}“
{content:format}
常用格式如下:
符号 | 说明 | 备注 |
---|---|---|
^、<、> | 分别是居中、左对齐、右对齐,后面带宽度 | {:^n} n是宽度 |
:char | :号后面带填充的字符,默认是空格 | |
"." | 数字定义数字精度格式. width.precision格式: width:指定宽度 precision:指定显示精度,格式为f,F,e,E和%时表示小数点后位数,格式为g和G时表示有效数字位数(小数点前位数+小数点后位数) |
适用于整数类型 |
b,d,o,x,X | 二进制、十进制、八进制、十六进制小写字母、十六进制大写字母 注意:B、D、O不是格式符。 |
适用于整数类型 |
”,“ | 金额的千位分隔符 | |
+ | 负数前面添加(-),正数前面添加(+) | 仅适用于数字类型 |
- | 负数前面添加(-),正数前面不加任何符号 | 仅适用于数字类型 |
(空格) | 负数前面添加(-),正数前面加一个空格 | 仅适用于数字类型 |
# | 切换数字显示方式,在数字面前显示进制符号,0b,0o,0x,0X | 仅适用于数字类型 |
s | 普通字符串格式 | 适用于字符串 |
c | 字符格式,按照unicode编码将整数转为对应字符 | 适用于整数 |
e | 科学计数法格式,e表示x10^ | 适用于浮点数、复数、整数(会自动转为浮点数) |
E | 科学计数法格式,E表示x10^ | 适用于浮点数、复数、整数(会自动转为浮点数) |
f | 定点数格式,默认精度是6 | 适用于浮点数、复数、整数(会自动转为浮点数) |
F | 与f等价,将nan和inf换成NAN和INF | 适用于浮点数、复数、整数(会自动转为浮点数) |
g | 通用格式,小数用f,大数用e | 适用于浮点数、复数、整数(会自动转为浮点数) |
G | 与g等价,但小数用F,大数用E | 适用于浮点数、复数、整数(会自动转为浮点数) |
% | 百分比格式,数字自动乘以100后按照f格式排版,添加%作为后缀 | 适用于浮点数、整数(会自动转为浮点数) |
示例:
# _*_ coding:utf-8 _*_
num = 1314.520
day = "星期六"
print('num:',num)
print("day:",day)
print('f"num = {num},day = {day}":',f"num = {num},day = {day}")
print('f"""num = {num},day = {day}""":',f"""
num = {num}
day = {day}""")
print('f"num = {num:^20}":',f"num = {num:,}")
print('f"num = {num:^20}":',f"num = {num:^20}")
print('f"num = {num:<20}":',f"num = {num:<20}")
print('f"num = {num:>20}":',f"num = {num:>20}")
print('f"num = {int(num):b}":',f"num = {int(num):b}")
print('f"num = {int(num):d}":',f"num = {int(num):d}")
print('f"num = {int(num):o}":',f"num = {int(num):o}")
print('f"num = {int(num):x}":',f"num = {int(num):x}")
print('f"num = {int(num):X}":',f"num = {int(num):X}")
print('f"num = {int(num):#b}":',f"num = {int(num):#b}")
print('f"num = {int(num):#d}":',f"num = {int(num):#d}")
print('f"num = {int(num):#o}":',f"num = {int(num):#o}")
print('f"num = {int(num):#x}":',f"num = {int(num):#x}")
print('f"num = {int(num):#X}":',f"num = {int(num):#X}")
print('f"num = {num*1000:e}":',f"num = {num*1000:e}")
print('f"num = {str(num):s}":',f"num = {str(num):s}")
print('f"num = {0x12:c}":',f"num = {0x12:c}")
print('f"num = {0x38:c}":',f"num = {0x38:c}")
print('f"num = {0x21:c}":',f"num = {0x21:c}")
print('f"num = {num:E}":',f"num = {num:E}")
print('f"num = {num:f}":',f"num = {num:f}")
print('f"num = {num:F}":',f"num = {num:F}")
print('f"num = {num:g}":',f"num = {num:g}")
print('f"num = {num:G}":',f"num = {num:G}")
print('f"num = {num:%}":',f"num = {num:%}")
# 结果如下:
num: 1314.52
day: 星期六
f"num = {num},day = {day}": num = 1314.52,day = 星期六
f"""num = {num},day = {day}""":
num = 1314.52
day = 星期六
f"num = {num:^20}": num = 1,314.52
f"num = {num:^20}": num = 1314.52
f"num = {num:<20}": num = 1314.52
f"num = {num:>20}": num = 1314.52
f"num = {int(num):b}": num = 10100100010
f"num = {int(num):d}": num = 1314
f"num = {int(num):o}": num = 2442
f"num = {int(num):x}": num = 522
f"num = {int(num):X}": num = 522
f"num = {int(num):#b}": num = 0b10100100010
f"num = {int(num):#d}": num = 1314
f"num = {int(num):#o}": num = 0o2442
f"num = {int(num):#x}": num = 0x522
f"num = {int(num):#X}": num = 0X522
f"num = {num*1000:e}": num = 1.314520e+06
f"num = {str(num):s}": num = 1314.52
f"num = {0x12:c}": num =
f"num = {0x38:c}": num = 8
f"num = {0x21:c}": num = !
f"num = {num:E}": num = 1.314520E+03
f"num = {num:f}": num = 1314.520000
f"num = {num:F}": num = 1314.520000
f"num = {num:g}": num = 1314.52
f"num = {num:G}": num = 1314.52
f"num = {num:%}": num = 131452.000000%
str.encode([encoding = "utf-8"][,errors = "strict"])
bytes.decode([encoding = "utf-8"][,errors = "strict"])
示例:
# _*_ coding:utf-8 _*_
test_string = "今天是个好日子,明天就放假了,la la la"
print("string:",test_string)
print("")
strbytes = test_string.encode()
print("test_string.encode():",strbytes)
print("test_string.decode():",strbytes.decode())
print("")
strbytes = test_string.encode("utf-8")
print('test_string.encode("utf-8"):',strbytes)
print('test_string.decode("utf-8"):',strbytes.decode("utf-8"))
print("")
strbytes = test_string.encode("gbk")
print('test_string.encode("gbk"):',strbytes)
print('test_string.decode("gbk"):',strbytes.decode("gbk"))
# 结果如下:
string: 今天是个好日子,明天就放假了,la la la
test_string.encode(): b'\xe4\xbb\x8a\xe5\xa4\xa9\xe6\x98\xaf\xe4\xb8\xaa\xe5\xa5\xbd\xe6\x97\xa5\xe5\xad\x90\xef\xbc\x8c\xe6\x98\x8e\xe5\xa4\xa9\xe5\xb0\xb1\xe6\x94\xbe\xe5\x81\x87\xe4\xba\x86\xef\xbc\x8cla la la'
test_string.decode(): 今天是个好日子,明天就放假了,la la la
test_string.encode("utf-8"): b'\xe4\xbb\x8a\xe5\xa4\xa9\xe6\x98\xaf\xe4\xb8\xaa\xe5\xa5\xbd\xe6\x97\xa5\xe5\xad\x90\xef\xbc\x8c\xe6\x98\x8e\xe5\xa4\xa9\xe5\xb0\xb1\xe6\x94\xbe\xe5\x81\x87\xe4\xba\x86\xef\xbc\x8cla la la'
test_string.decode("utf-8"): 今天是个好日子,明天就放假了,la la la
test_string.encode("gbk"): b'\xbd\xf1\xcc\xec\xca\xc7\xb8\xf6\xba\xc3\xc8\xd5\xd7\xd3\xa3\xac\xc3\xf7\xcc\xec\xbe\xcd\xb7\xc5\xbc\xd9\xc1\xcb\xa3\xacla la la'
test_string.decode("gbk"): 今天是个好日子,明天就放假了,la la la
>>>
正则表达式用来匹配字符串。
分类 | 字符 | 说明 | 备注 |
---|---|---|---|
行定位符 | ^ | 开始符,^+字符,表示以指定字符开始 | |
$ | 结尾符,字符+$,表示以指定字符结尾 | ||
字符 | 没有起始或结尾符,表示字符可以出现在任何位置 | ||
元字符 | . | 匹配除换行符以外的任意字符 | 不能匹配换行符”\n“ |
\w |
匹配字母、数字、下划线或汉字 | 不能匹配特殊字符 | |
\W | 匹配除字母、数字、下划线或汉字以外的字符 | 匹配特殊字符,不能匹配字母、数字、下划线或汉字 | |
\s | 匹配单个的空白符(包括tab键和换行符) | 匹配\t,\n、” “ | |
\S | 除单个空白符(包括tab键和换行符)以外的所有字符 | ||
\b | 匹配单词的开始或结束,单子的分界符通常是空格,标点符号或者换行符,\b字符表示以字符开始的单词,字符\b表示以字符结束的单词。 | ||
\d | 匹配数字 | ||
限定符 | ? | 匹配前面的字符零次或一次 | |
+ | 匹配前面的字符一次或者多次 | ||
* | 匹配前面的字符零次或多次 | ||
{n} | 匹配前面的字符:=n次 | ||
{n,} | 匹配前面的字符:>=n次 | ||
{n,m} | 匹配前面的字符:n次 <= 次数 <= m次。 | ||
字符类 | [] | 用[]括起字符用来匹配指定的字符其中一个,可用”-“连接字符串范围。 [aeiou]表示匹配aeiou其中一个字符; [0-9]表示匹配一个数字; [a-z]表示匹配一个小写字母; [\u4e00-\u9fa5]表示匹配一个汉字。 |
|
排除字符 | ^ | 在[]中开头写”^“表示匹配一个不是括号中的字符 [^a-zA-Z]匹配一个不是字母的字符 |
|
选择字符 | | | 类似于或,用来匹配多个条件的其中一个 | |
转移字符 | \ | 类似字符串的转义字符,用来将特殊字符转化为普通字符 | |
分组字符 | () | 适用给小括号可以对判定进行分组 |
正则表达式在python中用作模式字符串用来皮牌字符串。
如匹配字母:
“[a-zA-z]”
注意作为模式字符串时需要对“\”等特殊符号进行转移才能正常识别:
如:
"\bA*" # 会识别为"\","b"两个字符开头
“\\bA” # 可以识别为以A开头的单词。
一般建议适用r或R标识字符串,避免要输入大量的转义字符。
r"\bA" # 可以识别为以A开头的单词。
re模块是python用来实现正则表达式操作的模块,可以通过re模块的方法进行字符串处理,同时也可以进行正则表达式匹配。
使用re模块需要先导入模块:
import re
若没有导入模块,直接使用时会报错。
方法 | 说明 | 备注 |
---|---|---|
search() |
查找字符串 | |
match() | 匹配字符串 | |
findall() | 查找所有符合条件的字符串 | |
complie() | 将模式字符串转为正则表达式 | |
通常使用match(),search(),findall()等方法进行匹配。
match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回Match对象,否则返回None.
格式:
re.match(pattern,string,[flags])
常用标志:
标志 | 说明 |
---|---|
A或ASCII | 对于\w,\W,\b,\B,\d,\D,\s和\S只进行ASCII匹配 |
I或IGNORECASE | 不区分字母大小写 |
M或MULTILINE | 将^和$用于包括整个字符串的开始和结尾的每一个行(默认情况下,仅适用于整个字符串的开始和结尾) |
S或DOTALL | 使用(.)字符陪陪所有字符,包括\n(换行符) |
X或VERBOSE | 忽略模式字符串中未转义的空格和注释 |
示例:
# _*_ coding:utf-8 _*_
import re
print(r're.match(r"\bhe","he sad hello word."):',re.match(r"\bhe","he sad hello word."))
print(r're.match(r"\bhe","he sad hello word.",re.A):',re.match(r"\bhe","he sad hello word.",re.A))
print(r're.match(r"\bhe","He sad hello word."):',re.match(r"\bhe","He sad hello word."))
print(r're.match(r"\bhe","Hello word he sad.",re.I):',re.match(r"\bhe","Hello word he sad .",re.I))
# 结果如下:
re.match(r"\bhe","he sad hello word."):
re.match(r"\bhe","he sad hello word.",re.A):
re.match(r"\bhe","He sad hello word."): None
re.match(r"\bhe","Hello word he sad.",re.I):
>>>
Match对象包含匹配值的位置和匹配数据,常用方法如下
方法/属性 | 说明 | 备注 |
---|---|---|
start() | 获取匹配值的起始值 | |
end() | 获取匹配值的结束位置 | |
span() | 获取匹配位置的元组 | |
group() | 获取匹配的数据 | |
expand(self, /, template) | 返回通过对字符串模板进行反斜杠替换获得的字符串,就像sub()方法所做的那样。 | |
string | 获取要匹配的字符串 |
示例:
# _*_ coding:utf-8 _*_ import re pattern = r"^he.*\w+" string = "he said hello word." match = re.match(pattern,string,re.I) print(r'match.start():',match.start()) print(r'match.end():',match.end()) print(r'match.span():',match.span()) print(r'match.string():',match.string) print(r'match.group():',match.group()) print(r'match.expand("\nare\nyou"):',match.expand("\nare\nyou")) # 结果 match.start(): 0 match.end(): 18 match.span(): (0, 18) match.string(): he said hello word. match.group(): he said hello word match.expand("\nare\nyou"): are you >>>
用于在整个字符串中搜索第一个匹配的值,如果在起始位置匹配成功,返回Match,否则返回None。
格式如下:
re.search(pattern,string,[flags])
示例:
# _*_ coding:utf-8 _*_
import re
pattern = r"he\w+"
string = "he said hello word."
match = re.search(pattern,string)
print(match)
# 结果
用于获取整个字符串中素有符合正则表达式的字符串,并以列表的形式返回。
格式如下:
re.findall(pattern,string,[flags])
示例:
# _*_ coding:utf-8 _*_
import re
# 只有一个分组
pattern = r"[1-9]{1,3}(\.[0-9]{1,3}){3}"
string = "192.168.1.0 127.0.0.1"
match = re.findall(pattern,string)
print(match)
# 多个分组,返回值是按照分组次序获得的元组
pattern = r"([1-9]{1,3}(\.[0-9]{1,3}){3})"
string = "192.168.1.0 127.0.0.1"
match = re.findall(pattern,string)
print("match result:",match)
print("type:",type(match))
结果:
['.0', '.1']
match result: [('192.168.1.0', '.0'), ('127.0.0.1', '.1')]
type:
可以使用re.sub()方法实现字符串替换。
re.sub(pattern, rep1, string, count, flags)
示例:
# _*_ coding:utf-8 _*_
import re
pattern = r"(\.[0-9]{1,3}){3}"
string = "192.168.1.0 127.0.0.1"
match = re.sub(pattern,".x.x.x",string)
print(match)
结果:
192.x.x.x 127.x.x.x
使用re.split()方法可以实现根据正则表达式继续宁分割字符串,并以列表形式返回。
re.split(pattern, string, [maxsplit], [flags])
示例:
# _*_ coding:utf-8 _*_
import re
pattern = r"[.]"
string = "192.168.1.0 127.0.0.1 星期天,星期一,晴天/雨天, 好的V不好"
pattern = r"[ ]"
match = re.split(pattern,string)
print(r'[ ]:',match)
pattern = r"[,]"
match = re.split(pattern,string)
print(r'[,]:',match)
pattern = r"[,]"
match = re.split(pattern,string)
print(r'[,]:',match)
pattern = r"[/]"
match = re.split(pattern,string)
print(r'[/]:',match)
pattern = r"[v]"
match = re.split(pattern,string)
print(r'[v]:',match)
pattern = r"[v]"
match = re.split(pattern,string,0,re.I)
print(r'[v]:',match)
pattern = r"[., ,/v]"
match = re.split(pattern,string)
print(r'[., ,/v]:',match)
结果:
[ ]: ['192.168.1.0', '127.0.0.1', '星期天,星期一,晴天/雨天,', '好的V不好']
[,]: ['192.168.1.0 127.0.0.1 星期天,星期一', '晴天/雨天', ' 好的V不好']
[,]: ['192.168.1.0 127.0.0.1 星期天', '星期一,晴天/雨天, 好的V不好']
[/]: ['192.168.1.0 127.0.0.1 星期天,星期一,晴天', '雨天, 好的V不好']
[v]: ['192.168.1.0 127.0.0.1 星期天,星期一,晴天/雨天, 好的V不好']
[v]: ['192.168.1.0 127.0.0.1 星期天,星期一,晴天/雨天, 好的', '不好']
[., ,/v]: ['192', '168', '1', '0', '127', '0', '0', '1', '星期天', '星期一', '晴天', '雨天', '', '好的V不好']
>>>