Python 字符串完全指南:索引、切片、查找、替换与正则表达式
8. 字符串
字符串是 Python 中最常用的数据类型之一,本章将系统讲解字符串的索引、切片、遍历、常用方法、文件读写清洗,以及正则表达式基础,实现完整的文本处理能力。
8.1 字符串是字符序列
字符串是由有序字符组成的序列,每个字符对应一个位置编号,称为索引,索引从 0 开始。
fruit = 'banana'# 获取索引为 0 的字符fruit[0]
运行结果:
'b'
# 获取索引为 1 的字符fruit[1]
运行结果:
'a'
负索引(从末尾计数)
# 最后一个字符fruit[-1]# 倒数第二个字符fruit[-2]
运行结果:
'a''n'
获取字符串长度
len(fruit)
运行结果:
6
8.2 字符串切片
切片用于获取字符串的子串,格式:[起始:结束],包含起始位置,不包含结束位置。
fruit = 'banana'# 取索引 0 到 2(不包含 3)fruit[0:3]
运行结果:
'ban'
# 从头开始到索引 3 之前fruit[:3]
运行结果:
'ban'
# 从索引 3 开始到结尾fruit[3:]
运行结果:
'ana'
8.3 字符串不可变
字符串是不可变类型,不能直接修改某个位置的字符,只能通过切片拼接生成新字符串。
greeting = 'Hello, world!'# 错误写法:字符串不支持直接修改# greeting[0] = 'J'# 正确写法:切片 + 拼接new_greeting = 'J' + greeting[1:]print(new_greeting)
运行结果:
'Jello, world!'
8.4 字符串遍历
使用 for 循环逐个访问字符串中的字符。
word = 'banana'for char in word:print(char)
运行结果:
banana
8.5 字符串常用方法
word = 'banana'# 转换为大写word.upper()
运行结果:
'BANANA'
# 转换为小写word.lower()
运行结果:
'banana'
# 统计子字符串出现次数word.count('a')
运行结果:
3
# 判断是否以指定字符串开头word.startswith('ban')
运行结果:
True
# 判断是否以指定字符串结尾word.endswith('nana')
运行结果:
True
# 查找子串位置,返回第一个出现的索引word.find('nan')
运行结果:
2
8.6 字符串与列表相互转换
字符串 → 列表
s = 'spam'# 拆分为字符列表list(s)
运行结果:
['s', 'p', 'a', 'm']
s = 'hello world'# 按空格拆分为单词列表s.split()
运行结果:
['hello', 'world']
列表 → 字符串
words = ['hello', 'world']# 用空格连接列表为字符串' '.join(words)
运行结果:
'hello world'
8.7 文件读取与文本清洗
读取文本文件并去除换行符、空白字符,清洗文本内容。
# 打开并读取文件file = open('words.txt')# 逐行处理for line in file:# 去除首尾空白、换行符 word = line.strip()print(word)
8.8 字符串查找与替换
line = 'I love bananas, bananas are sweet'# 替换所有指定子串new_line = line.replace('bananas', 'apples')print(new_line)
运行结果:
'I love apples, apples are sweet'
8.9 正则表达式基础
使用 re 模块进行复杂模式匹配。
import retext = 'Hello, my email is test@example.com'# 查找邮箱match = re.search(r'\w+@\w+\.\w+', text)print(match.group())
运行结果:
'test@example.com'
# 替换文本中的数字re.sub(r'\d', 'X', 'Room 123, Table 45')
运行结果:
'Room XXX, Table XX'
8.10 术语表
8.11 练习
8.11.1 统计单词中元音字母数量
defcount_vowels(word):"""统计单词中元音字母的数量""" vowels = 'aeiouAEIOU' count = 0for char in word:if char in vowels: count += 1return countcount_vowels('banana')
运行结果:
3
8.11.2 判断回文字符串
defis_palindrome(s):"""判断字符串是否为回文""" s = s.lower()return s == s[::-1]is_palindrome('racecar')
运行结果:
True
8.11.3 去除字符串中所有数字
defremove_digits(s):"""去除字符串中的所有数字"""return''.join([char for char in s ifnot char.isdigit()])remove_digits('abc123def456')
运行结果:
'abcdef'