当然有!在 Python 中,虽然没有一个叫做 substring 的内置函数,但实现“子字符串”功能的方法非常直观和强大,主要依赖于字符串切片(String Slicing)。

下面我将为你详细介绍 Python 中获取子字符串的各种方法。
核心方法:字符串切片
这是最常用、最 Pythonic 的方法,其语法非常灵活。
基本语法
string[start:end:step]
string: 原始字符串。start: 起始索引(包含),如果省略,默认为0。end: 结束索引(不包含),如果省略,默认为字符串的长度。step: 步长(每隔多少个字符取一个),如果省略,默认为1。
重要提示:Python 的索引从 0 开始。
示例解析
my_string = "Hello, Python World!"
# 1. 获取从索引 7 开始到 13 结束的子字符串
# 'Python' (索引 7 到 12)
substring1 = my_string[7:13]
print(f"1. {substring1}") # 输出: Python
# 2. 省略 end,获取从索引 7 开始到字符串末尾的所有字符
substring2 = my_string[7:]
print(f"2. {substring2}") # 输出: Python World!
# 3. 省略 start,获取从字符串开头到索引 5 的子字符串
# 'Hello' (索引 0 到 4)
substring3 = my_string[:5]
print(f"3. {substring3}") # 输出: Hello
# 4. 省略 start 和 end,复制整个字符串
substring4 = my_string[:]
print(f"4. {substring4}") # 输出: Hello, Python World!
# 5. 使用负数索引(从字符串末尾开始计数,-1 是最后一个字符)
# 获取 'World!'
substring5 = my_string[-7:-1] # 从倒数第7个到倒数第2个
print(f"5. {substring5}") # 输出: World
# 要包含最后一个字符,end 索引可以留空
substring5_corrected = my_string[-7:]
print(f"5. Corrected: {substring5_corrected}") # 输出: World!
# 6. 使用步长
# 获取所有奇数位置的字符 (步长为 2)
substring6 = my_string[::2]
print(f"6. {substring6}") # 输出: Hlo, PtoWrd!
# 7. 反转字符串 (步长为 -1)
substring7 = my_string[::-1]
print(f"7. {substring7}") # 输出: !dlroW ,nohtyP olleH
其他相关方法
除了切片,Python 的字符串对象还提供了一些其他有用的方法来查找子字符串。

find() 方法
- 作用:查找子字符串第一次出现的位置,并返回其起始索引。
- 特点:如果找不到子字符串,返回
-1,不会报错。
my_string = "Hello, Python World!"
# 查找 'Python' 的索引
index = my_string.find("Python")
print(f"'Python' 的索引是: {index}") # 输出: 'Python' 的索引是: 7
# 查找一个不存在的子字符串
not_found = my_string.find("Java")
print(f"'Java' 的索引是: {not_found}") # 输出: 'Java' 的索引是: -1
index() 方法
- 作用:与
find()类似,查找子字符串第一次出现的位置,并返回其起始索引。 - 特点:如果找不到子字符串,会抛出
ValueError异常。
my_string = "Hello, Python World!"
# 查找 'World' 的索引
index = my_string.index("World")
print(f"'World' 的索引是: {index}") # 输出: 'World' 的索引是: 13
# 查找一个不存在的子字符串,会报错
try:
not_found = my_string.index("Java")
except ValueError as e:
print(f"使用 index() 查找失败: {e}") # 输出: 使用 index() 查找失败: substring not found
count() 方法
- 作用:统计子字符串在字符串中出现的总次数。
my_string = "banana"
# 统计 'a' 出现的次数
count_a = my_string.count("a")
print(f"'a' 出现了 {count_a} 次") # 输出: 'a' 出现了 3 次
# 统计 'an' 出现的次数
count_an = my_string.count("an")
print(f"'an' 出现了 {count_an} 次") # 输出: 'an' 出现了 2 次
in 关键字(检查子字符串是否存在)
如果你只想判断一个字符串是否是另一个字符串的子串(即是否存在),可以使用 in 关键字,它返回一个布尔值(True 或 False)。
my_string = "Hello, Python World!"
# 检查 'Python' 是否存在
is_present = "Python" in my_string
print(f"'Python' 是否存在: {is_present}") # 输出: 'Python' 是否存在: True
# 检查 'Java' 是否存在
is_present2 = "Java" in my_string
print(f"'Java' 是否存在: {is_present2}") # 输出: 'Java' 是否存在: False
总结与对比
| 方法 | 功能 | 返回值 | 如果找不到... | 适用场景 |
|---|---|---|---|---|
string[start:end] |
切片,提取子字符串 | 新的字符串 | N/A (不会报错) | 最常用,用于获取特定位置的子串。 |
string.find(sub) |
查找子串的起始索引 | 整数(索引) | 返回 -1 |
需要知道子串位置,但不希望程序因找不到而中断。 |
string.index(sub) |
查找子串的起始索引 | 整数(索引) | 抛出 ValueError |
确信子串一定存在,或者希望“找不到”成为一个明确的错误。 |
string.count(sub) |
统计子串出现的次数 | 整数(次数) | 返回 0 |
需要知道一个子串在字符串中出现了多少次。 |
sub in string |
检查子串是否存在 | 布尔值 (True/False) |
返回 False |
只需要做一个简单的“是/否”判断,不需要知道具体位置。 |
对于获取子字符串(Substring)这个需求,string[start:end] 切片是你最应该使用、也是最强大的工具,其他方法则用于更具体的场景,如查找位置、统计次数或进行存在性检查。

