第 9 课:字符串基础操作
所属模块: 基础概念 难度: Beginner 标签: string, match, replace, pattern 上一课: 哈希表 下一课: 递归基础
1. 学习目标
完成本课学习后,你将能够:
- 理解字符串在编程中的基本概念和表示方法。
- 掌握字符串的索引、切片等基本访问操作。
- 熟练使用
find,replace,split等核心方法进行文本处理。 - 了解并应用简单的字符串模式匹配(如
startswith,endswith)。 - 认识到字符串的不可变性及其对操作的影响。
2. 核心概念
什么是字符串?
字符串是编程中用于表示和处理文本数据的基本数据类型。你可以把它想象成一个由字符组成的、不可变的序列。就像一串珠子,每个珠子是一个字符,珠子的顺序是固定的,你不能直接改变其中一颗珠子,但可以用整个新珠串替换旧的。
字符串的创建与索引
在Python中,使用引号(单引号或双引号)创建字符串。每个字符都有一个位置编号,从左到右从0开始,称为索引。
my_str = "Hello, World!" # 创建字符串
first_char = my_str[0] # 索引为0的字符是'H'
字符串的不可变性
关键点:你不能通过索引直接修改字符串中的单个字符。
# my_str[0] = 'h' # 这会引发错误:TypeError: 'str' object does not support item assignment
# 正确做法是创建一个新字符串
new_str = 'h' + my_str[1:] # 使用切片和拼接
常用操作方法
字符串对象自带许多实用方法:
find(sub)/index(sub): 查找子字符串的位置。find找不到时返回-1,index会抛出异常。replace(old, new): 将所有old子串替换为new,返回新字符串。split(sep): 按分隔符sep将字符串分割成列表。strip(): 去除字符串两端的空白字符。startswith(prefix)/endswith(suffix): 检查字符串是否以特定前缀或后缀开头/结尾。
3. 代码示例
# 示例1:字符串创建、索引与切片
greeting = "Hello Python Learner!"
print(f"原始字符串: {greeting}")
print(f"第一个字符 (索引0): {greeting[0]}")
print(f"最后一个字符 (索引-1): {greeting[-1]}")
print(f"子字符串 (切片[6:12]): {greeting[6:12]}") # 包含索引6,不包含索引12
print()
# 示例2:查找与替换
sentence = "The quick brown fox jumps over the lazy dog."
# 查找'fox'第一次出现的位置
position = sentence.find('fox')
print(f"'fox' 的位置: {position}") # 输出: 16
# 将所有'the'(不区分大小写)替换为'a'
# 先使用lower()统一小写再替换,但这里直接替换'the'
new_sentence = sentence.replace('the', 'a') # 只替换小写'the'
print(f"替换后: {new_sentence}") # 输出: The quick brown fox jumps over a lazy dog.
print()
# 示例3:分割与清理
data = " apple, banana, cherry, date "
# 1. 去除两端空格
data_clean = data.strip()
print(f"清理后: '{data_clean}'")
# 2. 按逗号分割
fruits_list = data_clean.split(',')
print(f"分割后的列表: {fruits_list}")
# 3. 进一步清理每个元素的空格
fruits_list = [fruit.strip() for fruit in fruits_list]
print(f"清理每个元素后的列表: {fruits_list}")
print()
# 示例4:简单的模式检查
filename = "report_2023_final.pdf"
print(f"文件名是否以'.pdf'结尾: {filename.endswith('.pdf')}") # True
print(f"文件名是否以'report'开头: {filename.startswith('report')}") # True
4. 实践练习
练习1:字符串反转(简单)
题目:编写一个函数reverse_string(s),输入一个字符串,返回其反转后的字符串。例如:reverse_string("hello") 应返回 "olleh"。
要求:尝试使用至少两种不同的方法实现(例如:切片、循环)。
练习2:单词计数(中等)
题目:编写一个函数count_words(text),输入一段英文文本,返回一个字典,其中键是单词(转换为小写),值是该单词出现的次数。忽略标点符号。
示例输入:"Hello world! Hello python. World is great."
预期输出:{'hello': 2, 'world': 2, 'python': 1, 'is': 1, 'great': 1}
提示:使用split()、strip()、lower()和字典。
练习3:简单模板匹配(进阶)
题目:编写一个函数find_placeholders(template),输入一个包含{{name}}形式占位符的模板字符串,返回一个列表,包含所有找到的占位符名称。
示例输入:"Dear {{name}}, your order {{order_id}} is ready."
预期输出:['name', 'order_id']
提示:使用find方法或startswith/endswith结合循环来定位{{和}}。
5. 常见错误
- 混淆索引:记住索引从0开始,并且切片
s[start:end]不包含end索引的字符。 - 试图修改字符串:错误地认为可以像列表一样通过索引赋值来修改字符串。牢记字符串不可变,任何“修改”操作都是在创建新字符串。
- 忽略
split后的空元素:如果连续使用分隔符,split可能会产生空字符串元素。例如:"a,,b".split(',')结果是['a', '', 'b']。 - 区分
find和index:find返回-1表示未找到,适合做条件判断;index未找到会抛出ValueError,需要异常处理。 - 忽略大小写敏感:字符串比较和查找默认是大小写敏感的。处理前通常需要使用
lower()或upper()统一大小写。
6. 小结
- 字符串是序列:它是字符的有序集合,支持索引和切片访问。
- 不可变性是核心:字符串不能原地修改,所有返回新字符串的操作都是创建副本。
- 内置方法很强大:
find,replace,split,strip,startswith等是文本处理的基石,务必熟练掌握。 - 处理前先清理:在处理用户输入或外部数据时,使用
strip()和lower()等方法清理和标准化字符串,能避免很多后续问题。 - 简单模式匹配:除了复杂正则表达式,
startswith和endswith对于检查字符串头尾模式非常高效和直观。