第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 就像把"小明-小红-小刚"这样的人名串切成单独的名字。

配图1 - 配图1

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

配图2 - 配图2

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 开头的内容」……手撕复杂文本,从正则开始!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。