CC++ & Algorithm

Python字符串查找与子串

困难2
语言版本:C++Python
概述:学会在字符串中查找某个子串的位置,以及提取字符串的一部分(切片)。

字符串里找线索:查找与提取子串

字符串就像一串珠子,每个字符是一颗珠子,有固定的位置(索引)。有时候你想知道某颗珠子在哪里,或者想剪下一段珠子来用。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 最方便,它返回 TrueFalse

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() 统一转小写
混淆 findindex直接用 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() 嵌入变量。

掌握了这些基本功,你就能像熟练的侦探一样,在任意长的字符串里快速找到你想要的信息!

例题精讲

1单选题

在Python中,若字符串s='Hello, world!',执行s.find('o')和s.index('o')的结果分别是什么?

A4和4
B4和-1
C-1和4
D两者都抛出异常
2判断题

对于字符串s='ABCDEF',切片操作s[1:4]的结果是'BCD'。

3填空题
以下程序用于查找字符串s中是否包含子串'py',若找到则输出位置,否则输出-1。请补全代码。

s = 'I love Python'
pos = s.___('py')
print(pos)
4单选题

判断字符串s中是否包含子串'abc',下列表达式正确的是?

A'abc' in s
Bs in 'abc'
Cs.find('abc')
Ds.index('abc') != -1
5填空题
以下程序利用切片提取字符串email中的用户名部分('@'前的字符)。请补全代码。

email = 'student@example.com'
pos = email.find('@')
username = email[:___]
print(username)