第5章 5.1 字符串方法大全
🎯 开场 3 分钟:为什么要学这个?
上一章我们手把手做了通讯录管理系统,在这个过程中,你可能已经发现一个头疼的问题——输入的名字有空格怎么办?邮箱格式对不对?怎么把"张三"自动变成"Zhang San"?
这些问题的答案,都在字符串方法里。
想象一下,字符串就像是你的手机通讯录,每一条记录都是一个字符串。你需要学会怎么"拆快递"(split)、怎么"贴标签"(replace)、怎么"检查格式"(isdigit/isalpha)——这些操作在实战中太太太常见了。
学完这一章,你将能够:
- 像切菜一样熟练地拆分、拼接字符串
- 快速判断用户输入是数字、字母还是空格
- 自动清理表单数据里的多余空格和换行符
- 为下一章学习正则表达式打下坚实基础
🧱 基础 25 分钟:核心概念
什么是字符串方法?
先说个生活比喻。假设你有一把瑞士军刀,「切」是刀的功能,「拧螺丝」也是刀的功能。字符串方法就是字符串这把"数据瑞士军刀"自带的各种功能。
在 Python 里,方法是这么调用的:
字符串.方法名()
注意那个小点 .,它表示"属于"——就像说"这个苹果的红色"一样。
1. strip() —— 清理字符串两端的"空包裹"
你有没有遇到过这种情况?用户注册时不小心在名字前后敲了空格,导致显示出来歪歪扭扭的。strip() 就是帮你去掉这些多余空格的。
name = " 张三 "
clean_name = name.strip()
print(f"'{clean_name}'")
输出:
'张三'
说白了:strip() 就像拆快递时撕掉外面的气泡膜,只留里面的实际物品。
如果只想去掉左边或右边的空格,用 lstrip() 或 rstrip()。
2. lower() 和 upper() —— 字符串的大小写切换
登录网站时,用户输入 "ZhangSan"、"zhangsan" 或 "ZHANGSAN",系统都应该认得是同一个人。lower() 把所有字符变小写,upper() 把所有字符变大写。
user_input = "ZhangSan"
print(user_input.lower()) # 全部小写
print(user_input.upper()) # 全部大写
输出:
zhangsan
ZHANGSAN
为什么要用? 做搜索功能时,必须统一大小写才能匹配。
3. replace() —— 批量替换字符串
这个方法太常用了。比如你要把用户留言里的敏感词替换成 ***。
message = "这个产品太垃圾了,垃圾中的垃圾"
clean = message.replace("垃圾", "***")
print(clean)
输出:
这个产品太***了,***中的***
敲黑板:replace() 默认替换所有出现的地方,不会只换第一个。如果只想换一次,用 replace("老", "新", 1)。
4. split() —— 把字符串切成列表
这是最最重要的方法之一!类似拆快递,把一长串东西拆成单独的小件。
emails = "zhangsan@qq.com,lisi@163.com,wangwu@gmail.com"
email_list = emails.split(",")
print(email_list)
输出:
['zhangsan@qq.com', 'lisi@163.com', 'wangwu@gmail.com']
生活类比:split 就像把"小明-小红-小刚"这样的人名串切成单独的名字。

5. join() —— 把列表合成字符串
和 split 相反,join 把列表拼成字符串,用什么连接。
names = ["张三", "李四", "王五"]
result = "、".join(names)
print(result)
输出:
张三、李四、王五
为什么要用? 从数据库读取的列表要显示给用户看,就得用 join。
6. find() 和 index() —— 查找子串位置
想知道某个字符或单词在字符串的哪个位置?用 find() 或 index()。
text = "Python是最流行的编程语言之一"
pos = text.find("流行")
print(f"找到的位置是:{pos}")
pos2 = text.find("Java") # 不存在的会返回-1
print(f"Java的位置是:{pos2}")
输出:
找到的位置是:6
Java的位置是:-1
两者的区别:find() 找不到返回 -1,而 index() 找不到会报错。新手建议先用 find() 更安全。
7. count() —— 统计出现次数
想知道一篇文章里某个词出现了多少次?
article = "Python是一门优雅的语言,Python易于学习,Python功能强大"
python_count = article.count("Python")
print(f"Python出现了{python_count}次")
输出:
Python出现了3次
8. startswith() 和 endswith() —— 判断开头结尾
检查文件扩展名、判断 URL 协议特别有用。
filename = "report_2024.pdf"
print(filename.startswith("report")) # 是否以report开头
print(filename.endswith(".pdf")) # 是否以.pdf结尾
输出:
True
True
实用场景:批量处理文件时筛选特定类型。
9. isdigit() / isalpha() / isalnum() —— 字符类型判断
这几个方法帮你做输入校验,是做表单验证的利器。
print("123".isdigit()) # 是否全是数字
print("abc".isalpha()) # 是否全是字母
print("abc123".isalnum()) # 是否是字母或数字组合
输出:
True
True
True

10. 格式化字符串 f-string —— 拼接变量更优雅
传统写法要用 + 号拼接,f-string 让它变得超简洁:
name = "小明"
age = 18
score = 95.5
# f-string写法(推荐)
print(f"姓名:{name},年龄:{age},分数:{score}")
# 保留小数位
print(f"分数(保留1位):{score:.1f}")
输出:
姓名:小明,年龄:18,分数:95.5
分数(保留1位):95.5
为什么推荐 f-string? 比 str.format() 更直观,比 % 格式化更易读。
🔥 实战 35 分钟:3 个递进的小项目
项目 1:个人信息清洗器(5 分钟)
场景:用户注册时填的信息带有多余空格、大小写混乱,需要统一清洗。
# 项目1:个人信息清洗器
raw_name = " Zhang San "
raw_email = "Zhang@Gmail.COM"
# 清洗流程
clean_name = raw_name.strip().title() # 去除空格 + 首字母大写
clean_email = raw_email.strip().lower() # 去除空格 + 转小写
print(f"清洗后姓名:{clean_name}")
print(f"清洗后邮箱:{clean_email}")
预期输出:
清洗后姓名:Zhang San
清洗后邮箱:zhang@gmail.com
一句话解释:strip() 去掉多余空格,title() 把每个单词首字母变大写,lower() 转小写。方法可以链式调用。
项目 2:通讯录数据处理器(15 分钟)
场景:从 CSV 文件读取通讯录数据,清理格式后输出。
# 项目2:通讯录数据处理器
# 模拟CSV数据(实际可用open('contacts.csv').readlines()读取)
csv_data = """
姓名,电话,邮箱
张三,138-0000-0001,zhangsan@163.com
李四, 139-0000-0002 ,LISI@QQ.COM
王五,138-0000-0003,wangwu@gmail.com
"""
lines = csv_data.strip().split("\n")
print("=" * 50)
print("原始数据预览:")
for line in lines:
print(f" {repr(line)}")
# 解析并清洗
contacts = []
for i, line in enumerate(lines):
if i == 0: # 跳过表头
continue
# 按逗号分割
fields = line.split(",")
if len(fields) != 3:
continue
name, phone, email = fields
# 清洗每个字段
clean_name = name.strip()
clean_phone = phone.strip().replace("-", "") # 去掉电话中的横杠
clean_email = email.strip().lower()
# 格式化输出
formatted = f"{clean_name:<6} | {clean_phone:<11} | {clean_email}"
contacts.append(formatted)
print("\n" + "=" * 50)
print("清洗后数据:")
for c in contacts:
print(f" {c}")
预期输出:
==================================================
原始数据预览:
'姓名,电话,邮箱'
' 张三,138-0000-0001,zhangsan@163.com'
' 李四, 139-0000-0002 ,LISI@QQ.COM'
'王五,138-0000-0003,wangwu@gmail.com'
==================================================
清洗后数据:
张三 | 13800000001 | zhangsan@163.com
李四 | 13900000002 | lisi@qq.com
王五 | 13800000003 | wangwu@gmail.com
一句话解释:先用 split(",") 拆开字段,再用 strip() 去空格,最后用 lower() 统一格式。注意表头要跳过 (if i == 0)。
项目 3:待办事项小工具(15 分钟)
场景:做一个命令行待办清单,支持添加、完成、查看、删除操作。数据存储在本地 TXT 文件。
# 项目3:待办事项小工具
import os
TODO_FILE = "my_todos.txt"
def load_todos():
"""加载待办事项"""
if not os.path.exists(TODO_FILE):
return []
with open(TODO_FILE, "r", encoding="utf-8") as f:
return [line.strip() for line in f.readlines() if line.strip()]
def save_todos(todos):
"""保存待办事项"""
with open(TODO_FILE, "w", encoding="utf-8") as f:
for todo in todos:
f.write(todo + "\n")
def show_todos(todos):
"""显示待办列表"""
if not todos:
print("📝 待办列表是空的,添加一个吧!")
return
print("=" * 40)
print(f"📋 当前共有 {len(todos)} 项待办:")
for i, todo in enumerate(todos, 1):
# 解析状态
if todo.startswith("[完成] "):
status = "✅"
content = todo[6:]
else:
status = "⬜"
content = todo
print(f" {i}. {status} {content}")
print("=" * 40)
def add_todo(todos, item):
"""添加待办"""
clean_item = item.strip()
if not clean_item:
print("❌ 输入不能为空!")
return False
todos.append(clean_item)
print(f"✅ 已添加:{clean_item}")
return True
def complete_todo(todos, index):
"""标记完成"""
if 1 <= index <= len(todos):
todo = todos[index - 1]
if not todo.startswith("[完成]"):
todos[index - 1] = "[完成] " + todo
print(f"✅ 已完成:{todo}")
return True
else:
print("⚠️ 这项已经完成了!")
else:
print("❌ 无效的序号!")
return False
def delete_todo(todos, index):
"""删除待办"""
if 1 <= index <= len(todos):
removed = todos.pop(index - 1)
print(f"🗑️ 已删除:{removed}")
return True
else:
print("❌ 无效的序号!")
return False
# 主程序
def main():
todos = load_todos()
print("\n" + "🎯 欢迎使用待办事项小工具!")
print("命令:add 添加 / done 完成 / del 删除 / show 查看 / quit 退出")
while True:
cmd = input("\n请输入命令:").strip().lower()
if cmd == "quit":
save_todos(todos)
print("👋 再见!数据已保存。")
break
elif cmd == "show":
show_todos(todos)
elif cmd == "add":
item = input("请输入待办内容:")
if add_todo(todos, item):
save_todos(todos)
elif cmd == "done":
show_todos(todos)
try:
idx = int(input("请输入要完成的序号:"))
if complete_todo(todos, idx):
save_todos(todos)
except ValueError:
print("❌ 请输入数字!")
elif cmd == "del":
show_todos(todos)
try:
idx = int(input("请输入要删除的序号:"))
if delete_todo(todos, idx):
save_todos(todos)
except ValueError:
print("❌ 请输入数字!")
else:
print("❓ 未知命令,请输入 add / done / del / show / quit")
if __name__ == "__main__":
main()
运行示例:
🎯 欢迎使用待办事项小工具!
命令:add 添加 / done 完成 / del 删除 / show 查看 / quit 退出
请输入命令:add
请输入待办内容:学习Python字符串方法
✅ 已添加:学习Python字符串方法
请输入命令:show
========================================
📋 当前共有 1 项待办:
1. ⬜ 学习Python字符串方法
========================================
请输入命令:done
========================================
📋 当前共有 1 项待办:
1. ⬜ 学习Python字符串方法
========================================
请输入要完成的序号:1
✅ 已完成:学习Python字符串方法
请输入命令:quit
👋 再见!数据已保存。
一句话解释:用 strip() 清理用户输入,用文件读写 (open/read/write) 持久化数据,用 startswith() 判断待办状态。
💪 进阶 20 分钟:常见坑 + 性能小贴士
坑 1:字符串是不可变对象
❌ 错误示例:
s = "hello"
s[0] = "H" # TypeError: 'str' object does not support item assignment
✅ 正确做法:
s = "hello"
s = "H" + s[1:] # 重新赋值
print(s) # Hello
说白了:字符串像是刻在石头上的字,想改就得整块重刻。
坑 2:split() 默认会去掉空元素
❌ 错误示例:
data = "a,,b,c"
result = data.split(",")
print(result) # ['a', '', 'b', 'c'] — 有空字符串!
✅ 正确做法:
data = "a,,b,c"
result = [x for x in data.split(",") if x] # 过滤空字符串
print(result) # ['a', 'b', 'c']
坑 3:replace() 不会修改原字符串
❌ 错误示例:
message = "hello world"
message.replace("world", "python")
print(message) # hello world — 没变!
✅ 正确做法:
message = "hello world"
message = message.replace("world", "python") # 重新赋值
print(message) # hello python
坑 4:中文字符串长度用 len() 要小心
name = "张三"
print(len(name)) # 2 — 按字符算
# 如果要按字节算(UTF-8中文占3字节)
print(len(name.encode("utf-8"))) # 6
坑 5:格式化时忘了加 f 前缀
❌ 错误示例:
name = "小明"
print("姓名:{name}") # 输出:姓名:{name} — 变量没生效!
✅ 正确做法:
name = "小明"
print(f"姓名:{name}") # 输出:姓名:小明
性能小贴士:拼接大量字符串用 join 而非 +
# ❌ 低效:每次+都会创建新字符串
result = ""
for i in range(10000):
result += str(i)
# ✅ 高效:join只创建一次
parts = [str(i) for i in range(10000)]
result = "".join(parts)
调试技巧:用 repr() 查看隐藏字符
user_input = " hello "
print(f"普通输出:'{user_input}'") # 看起来正常
print(f"repr输出:{repr(user_input)}") # 显示\\x20空格
repr() 能显示转义字符,非常适合排查空格、换行符问题。
✏️ 练习题 + 作业题
练习题(5 道,10 分钟内完成)
练习 1(2 分钟):字符串基本操作
- 输入:" Python 字符串 "
- 预期输出:去除空格后显示 "Python字符串"
- 提示:链式调用两个方法
练习 2(2 分钟):判断数字
- 输入:"12345" 和 "12345a"
- 预期输出:第一个 True,第二个 False
- 提示:用 isdigit() 判断
练习 3(3 分钟):邮箱提取用户名
- 输入:"zhangsan@163.com"
- 预期输出:"zhangsan"
- 提示:用 split("@") 分割
练习 4(5 分钟):格式化输出
- 输入:["苹果", "香蕉", "橙子"]
- 预期输出:"我喜欢吃的水果有:苹果、香蕉、橙子"
- 提示:用 join() 拼接,配合 f-string
练习 5(3 分钟):找出报错原因
- 代码:
text = "Hello World"
text.replace("World", "Python")
print(text)
- 问题:为什么输出不是
"Hello Python"?怎么修?
作业题:做一个「文本数据清洗工具」
需求描述:
做一个命令行工具,能读取 TXT 文件并自动清洗格式。
功能点:
1. 从文件读取原始文本
2. 自动去除每行首尾空格
3. 统计处理后的行数、字符数
4. 支持 -u 参数将文本转为大写
5. 支持 -o output.txt 参数指定输出文件(默认输出到清洗后的文件加 _cleaned 后缀)
加分项:
- 统计出现最多的 3 个词(用 split() 切分后统计)
- 支持 --preview 参数先预览前 5 行,不实际处理
验收标准:
- 能用 python cleaner.py input.txt 正常运行
- 输出文件内容格式正确
- 代码有中文注释
提交方式:评论区贴代码或 GitHub 链接
📚 总结 + 资源
一句话总结:本章学习了 20+ 个字符串方法,重点掌握 strip/split/join/replace/find/count/isdigit 这些核心方法,它们是处理用户输入、清洗数据的必备工具。
延伸学习资源:
- 官方文档:https://docs.python.org/3/library/stdtypes.html#string-methods
- 《Python编程:从入门到实践》第 8 章(字符串操作)
- 视频:B 站小甲鱼《零基础学 Python》第 26-28 集
互动钩子:你在做毕业设计/工作报表时,有没有遇到过需要清洗大量文本数据的场景?评论区聊聊你是怎么解决的,老粉优先回复!
📌 下章预告:学会了字符串方法,下一章我们要学更强大的武器——正则表达式。它能帮你匹配「所有邮箱格式」「所有手机号」「所有以 XX 开头的内容」……手撕复杂文本,从正则开始!

评论(0)