CC++ & Algorithm

Python字符串高级操作

困难0
语言版本:C++
概述:学会切片、查找、替换和处理大小写,像用剪刀和胶水一样灵活操作文字。

用“剪刀、放大镜和颜料”玩转字符串: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(" ", "")

常见错误汇总

  1. 切片索引越界:虽然不会报错,但可能得到非预期结果。建议用len()先获取长度。
  2. 忘记字符串不可变replace()upper()等不会修改原字符串,必须赋值给新变量。
  3. 混淆find()index()find()找不到返回-1,index()报错。在不确定是否存在的场景,用find()并判断。
  4. 拆分后忘记是列表split()返回的是列表,不能直接对其使用upper()之类的方法,需要遍历。
  5. 大小写转换对中文无效:中文没有大小写,所以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),让输出更漂亮。

现在,你可以像拥有一套文字工具箱一样,随心所欲地处理任何字符串了!试试开头的小练习,看看自己是不是真的学会了?

例题精讲

1单选题

已知字符串 s = "Python编程",执行 print(s[0:6]) 后输出的结果是?

APython
B编程
CPytho
Dython
2判断题

执行 s = "Hello"; s.replace("l", "x") 后,s 的值会变成 "Hexxo"。

3填空题
下面代码使用 find 方法查找子串 "world" 在字符串 "hello world" 中的起始索引,请填空。

s = "hello world"
index = s.____("world")
print(index)  # 输出 6
4填空题
要将字符串 "python" 全部转换为大写并输出,请补全代码。

s = "python"
result = s.____()
print(result)  # 输出 "PYTHON"
5单选题

已知 s = "abcdef",执行 print(s[::-1]) 后输出的结果是?

A"fedcba"
B"abcde"
C"bcdef"
D"abcdef"