9·基础概念入门

字符串基础操作

stringmatchreplacepattern

第 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. 常见错误

  1. 混淆索引:记住索引从0开始,并且切片s[start:end]不包含end索引的字符。
  2. 试图修改字符串:错误地认为可以像列表一样通过索引赋值来修改字符串。牢记字符串不可变,任何“修改”操作都是在创建新字符串。
  3. 忽略split后的空元素:如果连续使用分隔符,split可能会产生空字符串元素。例如:"a,,b".split(',') 结果是 ['a', '', 'b']
  4. 区分findindexfind返回-1表示未找到,适合做条件判断;index未找到会抛出ValueError,需要异常处理。
  5. 忽略大小写敏感:字符串比较和查找默认是大小写敏感的。处理前通常需要使用lower()upper()统一大小写。

6. 小结

  • 字符串是序列:它是字符的有序集合,支持索引和切片访问。
  • 不可变性是核心:字符串不能原地修改,所有返回新字符串的操作都是创建副本。
  • 内置方法很强大find, replace, split, strip, startswith等是文本处理的基石,务必熟练掌握。
  • 处理前先清理:在处理用户输入或外部数据时,使用strip()lower()等方法清理和标准化字符串,能避免很多后续问题。
  • 简单模式匹配:除了复杂正则表达式,startswithendswith对于检查字符串头尾模式非常高效和直观。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「递归基础」 以巩固所学知识。