文章目录
- 前言
- 1、find()方法的使用
- 2、index()方法的使用
- 3、扩展:查找所有匹配的索引
- 4、find() 和 index() 的区别
- 5、关键注意事项及总结
前言
在python中我们在处理字符串类型的数据时,有时需要获取字符串中某个字符的索引
以确定其位置,方便进行一些计算和统计。而在Python中正好内置了两种方法find()和index()
可以帮助我们完成这种操作,接下来我将针对这两种方法,进行基础教学,并在此之上扩展一些使用技巧。
1、find()方法的使用
语法:
字符串.find(sub,start,end])
返回子字符串第一次出现的索引,若未找到则返回 -1。
1、参数说明:
-
sub
:要查找的子字符串(必填)。 -
start
(可选):搜索的起始索引(默认从 0 开始)。 -
end
(可选):搜索的结束索引(默认为字符串末尾,不包含此位置)。
2、方法运行机制:
-
从左到右搜索字符串。
-
当有多个符合条件时,只返回第一个匹配的子字符串的起始索引。
-
未找到时返回 -1。
3、案例演示:
案例1:基础查询
# 原始字符串
s = "Hello, welcome to Python!"# 查找子字符串 "wel" 的索引
index = s.find("wel")
print(index) # 输出: 7
案例2:限制索引范围查询
# 原始字符串
s = "Hello, welcome to Python!"# 查找字符 "o"(从索引 5 开始搜索)
index1 = s.find("o",5)
print(index1) # 输出: 11# 查找字符 "o"(从索引 5 开始搜索,到索引 10 结束搜索)
index2 = s.find('o',5,10)
print(index2) # 输出: -1
案例3:未知字符查询
# 原始字符串
s = "Hello, welcome to Python!"# 查找不存在的子字符串 "java"
index = s.find("java")
print(index) # 输出: -1
2、index()方法的使用
语法:
str.index(sub,start, end)
返回子字符串第一次出现的索引,若未找到则抛出 ValueError 异常。
1、参数说明:
-
sub
:要查找的子字符串(必填)。 -
start
(可选):搜索的起始索引(默认从 0 开始)。 -
end
(可选):搜索的结束索引(默认为字符串末尾,不包含此位置)。
2、方法运行机制:
-
从左到右搜索字符串。
-
当有多个符合条件时,只返回第一个匹配的子字符串的起始索引。
-
未找到时直接抛出异常。
3、案例演示
案例1:基础查询
# 原始字符串
s = "Hello, welcome to Python!"# 查找子字符串 "wel" 的索引
index = s.index("wel")
print(index) # 输出: 7
案例2:限制索引范围查询
# 原始字符串
s = "Hello, welcome to Python!"# 查找字符 "o"(从索引 5 开始搜索)
index1 = s.index("o",5)
print(index1) # 输出: 11# 查找字符 "o"(从索引 5 开始搜索,到索引 10 结束搜索)
try:index2 = s.index('o',5,10)
except ValueError as e:print(f"错误信息: {e}") # 输出: substring not found
# 因为index未查询到目标字符会导致程序报错,这里通过异常处理防止程序崩溃
案例3:未知字符查询
# 原始字符串
s = "Hello, welcome to Python!"try:# 查找不存在的子字符串 "java"index = s.index("java")
except ValueError as e:print(f"错误信息: {e}") # 输出: substring not found
3、扩展:查找所有匹配的索引
由于
find()
和index()
方法都只能返回匹配到的第一个字符的索引,因此我们需要借助循环来找到字符所有匹配的位置索引。
案例演示:
方法1:使用find()
进行查找
# 原始字符串
s = "Python is fun, Python is powerful"
# 需要查找的字符
sub = "Python"
# 存放字符匹配的所有索引
indices = []
# 确定起始索引位置
start = 0# 通过循环查询所有匹配的索引
while True:index = s.find(sub, start)if index == -1:break# 将匹配到的索引放入列表indices.append(index)start = index + 1 # 移动起始位置继续查找print(f"所有 '{sub}' 的索引为: {indices}") # 输出: [0, 15]
方法2:使用index()
进行查找
# 原始字符串
s = "Python is fun, Python is powerful"
# 需要查找的字符
sub = "Python"
# 存放字符匹配的所有索引
indices = []
# 确定起始索引位置
start = 0# 通过循环查询所有匹配的索引
while True:try:index = s.index(sub, start)except:break# 将匹配到的索引放入列表indices.append(index)start = index + 1 # 移动起始位置继续查找print(f"所有 '{sub}' 的索引为: {indices}") # 输出: [0, 15]
方法3:使用enumerate()
方法进行查找
# 原始字符串
s = "hello world"
# 需要查询的字符
char = "o"# 结合列表推导式,查询所有匹配的索引
indices = [i for i, c in enumerate(s) if c == char]
print(indices) # 输出: [4, 7]
4、find() 和 index() 的区别
方法 | 未找到时的行为 | 适用场景 |
---|---|---|
find() | 返回 -1 | 安全查找,无需处理异常 |
index() | 抛出 ValueError 异常 | 明确知道子字符串存在时使用 |
5、关键注意事项及总结
1、 大小写敏感:
这两个方法区分大小写。例如 find(“A”) 和 find(“a”) 结果不同。
s = "Apple"
print(s.find("a")) # 输出: -1
2、子字符串长度:
可以查找任意长度的子字符串,例如 find(“Py”) 会返回起始索引。
s = "Python"
print(s.find("Py")) # 输出: 0
3、参数范围:
start 和 end 可以是负数,但会被解释为从字符串末尾倒数。
s = "abcdef"
print(s.find("c", -5)) # 输出: 2 (这里-5 相当于索引 1)
总结:
-
优先使用
find()
:避免异常处理,适合不确定子字符串是否存在的情况。 -
明确存在时用
index()
:若确定子字符串存在,可以用 index() 直接获取索引。 -
批量查找:
find()
和index()
结合循环可以查找所有匹配位置,也可以通过enumerate()
方法进行查找。