Python字符串高级操作
困难0用“剪刀、放大镜和颜料”玩转字符串:Python高级操作指南
同学们,还记得我们上次用绳子(字符串)打结、拼接吗?但现实中的文字处理可不止这么简单。比如你从网上复制了一段话,想只取出其中一句;或者想统计某个词出现了几次;又或者想把所有单词变成大写……这些操作就像给文字配上了剪刀(切片)、放大镜(查找)、胶水与画笔(替换、拆分和大小写变换)。掌握了它们,你就能像魔术师一样灵活地操纵任何文字!
下面我们一个一个来学习。
1. 字符串切片:像切西瓜一样取子串
我们经常需要从一大段文字中“切”下一小段。Python用方括号[起始:结束:步长]实现,记住原则:包含起始位置,不包含结束位置(可以联想“顾头不顾尾”)。
s = "Python编程" # 定义一个字符串
print(s[0:6]) # 输出:Python(取索引0到5的字符,索引6是结束但不包括)
print(s[6:]) # 输出:编程(从索引6到末尾,省略结束表示到最后)
print(s[:6]) # 输出:Python(从开头到索引5,省略起始表示从0开始)
print(s[::2]) # 输出:Pto编(步长为2,隔一个取一个)
切片不会改变原字符串,而是返回一个新字符串。这就像你用西瓜刀切下一块瓜,原来的西瓜还在。
生活中的例子:假如你的学号是“20240301”,想只取年份“2024”:
student_id = "20240301" # 学生学号
year = student_id[0:4] # 取前4个字符
print(year) # 输出:2024
步长还能为负数,实现倒着取:
s = "Python"
print(s[::-1]) # 输出:nohtyP(步长为-1,字符串反转)
常见错误:索引超出范围不会报错,但会尽可能取到边界。比如s[0:100]不会报错,只取到字符串末尾。
2. 查找子串:用放大镜找词的位置
我们常需要知道某个词语在字符串中的位置,或者它出现了几次。Python提供了以下方法:
find() 和 index()
find(sub):返回子串第一次出现的起始索引,如果找不到返回-1。index(sub):功能相同,但找不到会报错(抛出异常)。所以推荐用find()。
text = "我喜欢Python,Python很有趣" # 一段话
pos = text.find("Python")
print(pos) # 输出:3(因为“我”“喜”“欢”占了索引0,1,2,所以Python从索引3开始)
# 找不存在的词
pos2 = text.find("Java")
print(pos2) # 输出:-1
生活例子:你要从朋友发来的消息中找出“作业”这个词的位置:
msg = "今天的数学作业是第5页,语文作业是第10页" # 朋友的消息
homework_pos = msg.find("作业")
print("第一次出现'作业'的位置:", homework_pos) # 输出:4
更多查找方法:
rfind():从右边(末尾)开始找,返回最后一次出现的位置。count():统计子串出现的次数。
text = "苹果香蕉苹果葡萄苹果"
cnt = text.count("苹果")
print(cnt) # 输出:3(苹果出现了3次)
last = text.rfind("苹果")
print(last) # 输出:12(最后一个苹果的起始索引)
常见错误:混淆find()和index(),忘记find()找不到返回-1而直接用返回值做索引,会导致错误。应该先判断:
if text.find("Python") != -1:
print("找到了!")
3. 替换与拆分:胶水和拆解工具
替换——replace()
replace(old, new, count)可以把字符串中的某段文字全部换成另一段。第三个参数count可选,指定替换的次数(默认全部替换)。
msg = "Hello World, Hello Python" # 原始消息
new_msg = msg.replace("Hello", "Hi")
print(new_msg) # 输出:Hi World, Hi Python
# 只替换第一个
new_msg2 = msg.replace("Hello", "Hi", 1)
print(new_msg2) # 输出:Hi World, Hello Python
生活例子:你写作文时把“高兴”写成了“高兴高兴”,想改正:
sentence = "我今天非常高兴高兴" # 写错的文章
correct = sentence.replace("高兴高兴", "高兴")
print(correct) # 输出:我今天非常高兴
注意:replace()不会改变原字符串,而是生成新字符串。必须用变量接收结果。
拆分——split()
split(separator, maxsplit)可以把字符串按某个符号拆分成一个列表(list)。如果不指定分隔符,默认按空格拆分。maxsplit可选,指定拆分的最大次数。
fruits = "苹果,香蕉,橙子" # 水果列表字符串
fruit_list = fruits.split(",")
print(fruit_list) # 输出:['苹果', '香蕉', '橙子']
# 按空格拆分句子
sentence = "one two three four"
words = sentence.split()
print(words) # 输出:['one', 'two', 'three', 'four']
# 只拆一次
s = "a-b-c-d"
parts = s.split("-", 2) # 最多拆2次,得到3部分
print(parts) # 输出:['a', 'b', 'c-d']
生活例子:老师给了一个成绩单“张三:95,李四:88,王五:92”,你想把它变成列表:
grade_str = "张三:95,李四:88,王五:92" # 成绩字符串
grades = grade_str.split(",") # 先按逗号拆成 ['张三:95', '李四:88', ...]
for g in grades:
name, score = g.split(":") # 再按冒号拆
print(name, "得分", score)
常见错误:拆分后得到的是列表,不是字符串,不能直接当作字符串操作。另外,如果分隔符在字符串开头或结尾,会产生空字符串元素。
4. 大小写转换:给文字涂上不同颜色
有时我们需要统一大小写,比如用户输入时可能大小写混杂,我们想转换成标准格式。
| 方法 | 作用 | 例子 |
|---|---|---|
upper() | 全部转成大写 | "hello".upper() → "HELLO" |
lower() | 全部转成小写 | "HELLO".lower() → "hello" |
capitalize() | 首字母大写,其余小写 | "hELLO".capitalize() → "Hello" |
title() | 每个单词首字母大写 | "hello world".title() → "Hello World" |
word = "hello python"
print(word.upper()) # 输出:HELLO PYTHON
print(word.title()) # 输出:Hello Python
生活例子:注册账号时,用户名通常忽略大小写,我们可以统一转为小写存储:
username = input("请输入用户名:") # 用户输入"XiaoMing"
clean_name = username.lower() # 转为"xiaoming"
print(clean_name)
额外的方法:
swapcase():大写变小写,小写变大写。istitle()、isupper()等判断方法,返回布尔值。
5. 去除空白:清理脏数据
用户输入时常有多余的空格或换行,比如名字前输入了空格。我们用strip()、lstrip()、rstrip()来清理。
strip():去掉字符串两端的空白(空格、制表符\t、换行\n等)。lstrip():去掉左边的空白。rstrip():去掉右边的空白。
user_input = " 小明 " # 用户输入,前后有空格
clean = user_input.strip()
print("结果:" + clean + "长度") # 输出:结果:小明长度(无空格)
# 更贴近生活的场景:读取文件中的一行可能末尾有换行符
line = "第1行\n"
print(repr(line.strip())) # 输出:'第1行'
常见错误:strip()默认只去掉两端的空白,不会去掉中间的。如果想去掉所有空格,要用replace(" ", "")。
常见错误汇总
- 切片索引越界:虽然不会报错,但可能得到非预期结果。建议用
len()先获取长度。 - 忘记字符串不可变:
replace()、upper()等不会修改原字符串,必须赋值给新变量。 - 混淆
find()和index():find()找不到返回-1,index()报错。在不确定是否存在的场景,用find()并判断。 - 拆分后忘记是列表:
split()返回的是列表,不能直接对其使用upper()之类的方法,需要遍历。 - 大小写转换对中文无效:中文没有大小写,所以
upper()对中文无影响。
完整示例:清洗用户输入的学生信息
假设我们要收集学生信息,格式如“姓名-班级-年龄”,但用户可能输入不规范:有多余空格、大小写不统一、分隔符不统一。我们用学到的知识来清洗。
# 模拟用户输入(实际可用input())
raw = " 张三 - 三年二班 - 10 " # 原始输入,有空格
# 1. 去除两端空格
clean = raw.strip()
# 2. 按“-”拆分(注意:用户可能用空格隔开,但split()默认按空白拆分?)
# 这里我们先用“-”拆分
parts = clean.split("-") # 得到 ['张三 ', ' 三年二班 ', ' 10 ']
# 3. 对每个部分去除空格,并统一大小写(名字可能大小写,这里用小写)
name = parts[0].strip() # 姓名
class_name = parts[1].strip() # 班级(可能有空格)
age = parts[2].strip() # 年龄
# 4. 输出清洗后结果
print("姓名:", name)
print("班级:", class_name)
print("年龄:", age)
运行结果:
姓名: 张三
班级: 三年二班
年龄: 10
如果用户输入的是英文名字,比如“tom - class3 - 9”,我们可以用name.lower()转为小写。
相关指引
- 想深入学习字符串,可以看 Python字符串基础(索引、长度、循环遍历)。
- 如果要做更复杂的文本处理(比如按多个分隔符拆分、提取所有数字),可以学习正则表达式(re模块)。
- 这些字符串操作常和列表、for循环、条件判断一起使用,建议先掌握列表的基本操作。
- 下一篇文章可以继续字符串格式化(f-string, format),让输出更漂亮。
现在,你可以像拥有一套文字工具箱一样,随心所欲地处理任何字符串了!试试开头的小练习,看看自己是不是真的学会了?
例题精讲
已知字符串 s = "Python编程",执行 print(s[0:6]) 后输出的结果是?
执行 s = "Hello"; s.replace("l", "x") 后,s 的值会变成 "Hexxo"。
下面代码使用 find 方法查找子串 "world" 在字符串 "hello world" 中的起始索引,请填空。
s = "hello world"
index = s.____("world")
print(index) # 输出 6要将字符串 "python" 全部转换为大写并输出,请补全代码。
s = "python"
result = s.____()
print(result) # 输出 "PYTHON"已知 s = "abcdef",执行 print(s[::-1]) 后输出的结果是?