前言
写Python没人能绕开字符串,打印日志、处理文本、接口传参、爬虫解析全靠它。不少新手只会用""包一段文字,索引、切片、格式化、各类内置方法一团乱,找个字符报错、分割字符串乱码、大小写转换写一堆if判断,踩坑踩得头大。今天一次性把字符串全套操作捋明白,逻辑严谨不遗漏,语言轻松不枯燥,看完直接收藏当速查手册!
一、字符串基础:什么是字符串
简单说,被单引号、双引号、三引号包裹的文本内容就是字符串。
重中之重:字符串是不可变序列
这是所有字符串操作的底层核心,一定要刻进脑子里:字符串一旦创建完成,不能直接修改内部任意单个字符,不存在原地修改的操作。不管你调用大小写、替换、切片、剔除空白等任何方法,都不会改动原始字符串,只会生成一段全新字符串作为返回值。
s = "python" # 尝试直接修改字符,直接报错 # s[0] = 'P' # TypeError: 'str' object does not support item assignment # 正确写法:接收新返回的字符串 new_s = s.capitalize() print(s) # 原字符串不变:python print(new_s) # 新字符串:Python后续所有内置方法全都遵循这个规则,忘记不可变特性很容易写出丢数据的bug。
s1 = "普通双引号字符串" s2 = '单引号也能用' s3 = """多行文本直接换行不用转义"""二、转义字符:解决字符串里的“冲突符号”
如果文本内部自带引号、换行、制表符、反斜杠,直接写会语法报错,这时候就要出动转义符\:
\'、\":字符串内部输出单/双引号\n:换行、\t:制表空格\\:输出单纯反斜杠
不想转义可以用原始字符串r"xxx",文件路径处理必备:
# 转义示例 print("我说:\"Python字符串超好用\"") # 原始字符串无视转义 path = r"C:\user\code\python"三、三种字符串格式化,按需选用
日常拼接字符串别傻傻用+硬拼,效率低还难读,三种格式化按需拿捏:
- % 老式格式化:兼容老旧项目,适合简单占位
- str.format():灵活传参、位置匹配、填充对齐
- f-string(推荐):简洁直观,Python3.6+首选
name = "码农" print(f"我是{name},精通字符串操作") print("我是{},精通字符串操作".format(name))四、索引:精准定位单个字符
字符串是有序序列,每个字符自带下标索引:从左从0开始,从右从-1开始。通过字符串[下标]取出单个字符,下标超出范围直接抛索引报错。再次提醒:只能读取,不能赋值修改字符!
s = "hello" print(s[0]) # h print(s[-1]) # o五、切片:截取一段子串(Python字符串神技)
格式:字符串[start:end:step]
- start:起始下标(包含),默认0
- end:结束下标(不包含),默认末尾
- step:步长,负数实现倒序截取
切片超出下标不会报错,自动截断边界,比索引容错性高一大截。切片只会产出新字符串,原文本丝毫不变。
s = "hello world" print(s[0:5]) print(s[::-1]) # 字符串反转六、遍历字符串:逐个读取字符
两种主流遍历方式,按需使用:
- for循环直接遍历字符:最简写法
- for+range+len:同时拿到下标+字符
遍历仅读取字符,全程无法修改原字符串内容。
s = "python" # 只拿字符 for char in s: print(char) # 下标+字符 for i in range(len(s)): print(i, s[i])七、字符串核心内置方法大全(附踩坑详解)
全文重点,按功能分类整理,附带代码演示与避坑要点,逻辑清晰不混乱。所有方法统一特性:不改变原字符串,返回全新字符串/数值/布尔值。
7.1 查找字符:index/rindex VS find/rfind(高频踩坑点)
两个功能高度相似的工具,核心区别只有一句话:找不到目标时的处理逻辑
- index、rindex:找到返回下标,找不到直接抛出
ValueError程序崩溃- index:从左往右搜;rindex:从右往左搜
- find、rfind:找到返回下标,找不到返回
-1,程序不会中断- find:从左往右搜;rfind:从右往左搜
两者都支持传参(目标串, start, end),限定查找区间,默认全字符串检索。
s = "hello world" # index找不到直接报错,稳妥写法先判断in if "llo" in s: print(s.index("llo")) # find容错性拉满,不用额外判断 print(s.find("ll0")) # 不存在返回-1 # 指定查找区间 print(s.find("l", 4, 5)) print(s.rfind("l"))7.2 count:统计子串出现次数
用法:字符串.count(子串, start, end),区间内没有匹配内容返回0,适合统计关键词出现频次:
print("hello world".count("l", 4))7.3 大小写转换全家桶
五种转换各司其职,不用自己写判断替换,全部生成新字符串:
- lower():全部转为小写
- upper():全部转为大写
- capitalize():整个字符串首字母大写,其余全小写
- title():每个单词首字母大写
- swapcase():大小写互相反转
text = "heLlo WorlD" print(text.lower()) print(text.upper()) print(text.capitalize()) print(text.title()) print(text.swapcase())7.4 文本对齐:排版打印专用
做控制台表格、格式化输出必备四个对齐方法,统一格式方法(总长度, 填充字符),填充字符不传默认空格:
- center(width, fillchar):居中对齐
- ljust(width, fillchar):左对齐,右侧填充
- rjust(width, fillchar):右对齐,左侧填充
- zfill(width):特殊右对齐,左侧自动补0,数字字符串格式化神器
s = "hello world" print(s.center(20, "*")) print(s.ljust(20, "*")) print(s.rjust(20, "*")) print(s.zfill(20))7.5 判断首尾字符:startswith & endswith
快速判断字符串是否以指定内容开头/结尾,返回布尔值True/False,文件后缀判断、文本前缀筛选常用:
text = " hello world " print(text.startswith(" ")) print(text.endswith(" "))7.6 剔除首尾字符:strip系列
默认剔除首尾空白(空格、换行、制表符),传参则剔除指定符号;原字符串不会被删减,需要用变量接收结果:
- strip():左右两边同时剔除
- lstrip():只剔除左侧
- rstrip():只剔除右侧
print(" hello world ".strip()) print("+++hello world+++".strip("+")) print("+++hello world+++".lstrip("+")) print("+++hello world+++".rstrip("+"))7.7 切割、拼接、替换,文本处理三巨头
1)join:序列拼接字符串
和split反向操作,用指定分隔符把列表、字符串等序列里的元素拼为一整段文本,效率远超+拼接:
print("++".join("hello")) print(" ".join(['hello', 'world']))2)split:切割字符串为列表
不传参数默认按所有空白分割,传入字符则以该字符切割,可额外限制切割次数:
print("hello world".split()) print("hello world".split('l'))3)replace:批量替换文本
参数:replace(旧内容, 新内容, 替换次数),指定次数则只替换前N个匹配项,不指定全局替换;替换结果是新字符串,原文本纹丝不动:
print("hello world hello china".replace("hello", "hi", 1))7.8 编码与解码:字符串与字节流转换
网络传输、文件读写底层都是字节流,两套转换规则必须分清:
- encode(编码格式):字符串 → 字节流bytes,输出带
b''标识 - decode(编码格式):bytes字节流 → 原始字符串,编码不匹配直接乱码报错
常用编码:utf-8、gbk,中文Windows环境文件常使用gbk编码:
# 编码 print("hello world 123 中国".encode("gbk")) # 解码 print(b'hello world 123 \xd6\xd0\xb9\xfa'.decode("gbk"))7.9 is系列判断方法,校验文本类型
全部返回布尔值,表单校验、数据清洗高频使用:
- isalpha():全部由纯字母组成
- isdigit():全部由纯数字组成
- isalnum():仅包含字母+数字,无符号空格
- islower():所有字母全小写
- isupper():所有字母全大写
- istitle():每个单词首字母大写,其余小写
print("az".isalpha()) print("19".isdigit()) print("19az".isalnum()) print("Az".islower()) print("Az".isupper()) print("Az Bz".istitle())