Python字符串查找与子串
困难2字符串里找线索:查找与提取子串
字符串就像一串珠子,每个字符是一颗珠子,有固定的位置(索引)。有时候你想知道某颗珠子在哪里,或者想剪下一段珠子来用。Python 提供了方便的“查找”和“切片”功能,让你像侦探一样在字符串里快速找到线索。
1. 用 find() 查找子串第一次出现的位置
find(子串) 返回子串在字符串中第一次出现的起始索引(从 0 开始数)。如果找不到,返回 -1。
text = "I love Python programming"
position = text.find("Python") # 查找"Python"第一次出现的位置
print(position) # 输出: 7(因为"Python"从索引7开始)
生活中的例子:你想在短信里找到“作业”这个词第一次出现在哪里,用 find() 就能知道从第几个字开始。
注意:索引从 0 开始,所以第一个字符的位置是 0,第二个是 1,以此类推。
2. 用 rfind() 查找最后一次出现的位置
如果字符串里同一个子串出现多次,find() 只返回第一个。想要最后一个的位置,用 rfind()。
text = "hello world hello"
last_pos = text.rfind("hello")
print(last_pos) # 输出: 12(倒数第二个单词"hello"从索引12开始)
小提示:r 代表 right(从右边开始找)。
3. 用 in 操作符快速检查是否存在
有时候你只想知道某个子串在不在里面,而不关心具体位置。用 in 最方便,它返回 True 或 False。
text = "GESP level 3"
print("level" in text) # True
print("Level" in text) # False(大小写敏感)
常见错误:忘记 Python 区分大小写。"Level" 和 "level" 是不同的。
4. 用切片提取子串(剪珠子)
切片就像用剪刀剪出一段绳子。格式是:
字符串[开始索引:结束索引:步长]
最常用的是只写开始和结束。注意:结束索引对应的字符不包含在结果里。
s = "Python"
# 从索引0到3(不包含3),得到"Pyt"
part = s[0:3]
print(part) # 输出: Pyt
# 从索引2到最后
part2 = s[2:]
print(part2) # 输出: thon
# 从开始到索引2(不包含2)
part3 = s[:2]
print(part3) # 输出: Py
# 负数索引:从末尾开始数,-1是最后一个字符
last_char = s[-1]
print(last_char) # n
生活中的例子:你有一串班级名单,想取前三个同学的名字,用 names[:3] 就可以。
常见错误:
- 忘记结束索引不包含在内。比如
s[0:3]得到的是第 0、1、2 个字符,共 3 个,不是第 0~3 共 4 个。 - 索引越界:如果切片开始索引超出范围,Python 不会报错,而是返回空字符串。例如
s[10:15]返回''。
5. index() 和 count() 补充
index():功能类似 find(),但找不到会报错
text = "Python is fun"
pos = text.index("is") # 返回 7
# 如果找 "Java",程序会崩溃(ValueError)
# pos2 = text.index("Java") # 报错
建议:除非你确定子串一定存在,否则优先用 find(),避免程序意外停止。
count():统计子串出现的次数
sentence = "I like Python, you like Python too"
count_py = sentence.count("Python") # 统计"Python"出现几次
print(count_py) # 输出: 2
这个方法在检查单词出现频率时很有用。
6. 新手容易犯的错误
| 错误类型 | 错误例子 | 正确做法 |
|---|---|---|
| 忘记索引从0开始 | text.find("a") 以为第一个字符是1 | 理解字符串索引从0开始 |
| 切片结束索引弄错 | s[0:2] 以为得到前三个字符 | 记住结束索引不包含,前两个字符是 s[0:2] |
| 大小写混用 | "Hello" in "hello world" 返回 False | 可以先用 .lower() 统一转小写 |
混淆 find 和 index | 直接用 index 导致程序崩溃 | 不确定存在时用 find 检查 |
7. 完整示例:从句子中提取第一个单词
# 一句话
sentence = "GESP level 3 exam is easy."
# 找到第一个空格的位置
first_space_pos = sentence.find(" ") # 找到第一个空格,索引是4
# 从开头到第一个空格之前,就是第一个单词
first_word = sentence[:first_space_pos] # 得到 "GESP"
# 输出结果
print("第一个单词是:", first_word)
# 如果句子中没有空格,find 返回 -1,需要特殊处理
sentence2 = "Hello"
space_pos2 = sentence2.find(" ") # 返回 -1
if space_pos2 == -1:
# 没有空格时整个句子就是一个单词
first_word2 = sentence2
else:
first_word2 = sentence2[:space_pos2]
print("第二个句子的第一个单词:", first_word2)
运行结果:
第一个单词是: GESP
第二个句子的第一个单词: Hello
8. 相关指引
学会了查找和切片,你可以继续探索:
- 字符串替换:用
replace()替换子串。 - 字符串分割:用
split()按分隔符拆成列表。 - 字符串连接:用
join()把列表拼成字符串。 - 字符串格式化:用 f-string 或
format()嵌入变量。
掌握了这些基本功,你就能像熟练的侦探一样,在任意长的字符串里快速找到你想要的信息!
例题精讲
在Python中,若字符串s='Hello, world!',执行s.find('o')和s.index('o')的结果分别是什么?
对于字符串s='ABCDEF',切片操作s[1:4]的结果是'BCD'。
以下程序用于查找字符串s中是否包含子串'py',若找到则输出位置,否则输出-1。请补全代码。
s = 'I love Python'
pos = s.___('py')
print(pos)判断字符串s中是否包含子串'abc',下列表达式正确的是?
以下程序利用切片提取字符串email中的用户名部分('@'前的字符)。请补全代码。
email = 'student@example.com'
pos = email.find('@')
username = email[:___]
print(username)