Python中获取字符串子串的方法

Python中获取字符串子串的方法

技术背景

在Python编程中,经常需要从一个字符串中提取部分内容,也就是获取子串。Python提供了强大且灵活的方式来实现这一需求,其中最常用的是切片(slicing)操作。

实现步骤

基本切片操作

Python的切片操作使用方括号 [] 来实现,基本语法为 string[start:stop:step],其中 start 是起始索引,stop 是结束索引(不包含该索引对应的字符),step 是步长(可选,默认为1)。

  • startstop 省略时,分别默认从字符串开头和到字符串结尾。
  • step 为负数时,表示从右向左切片。

示例操作

以下是一些常见的切片操作示例:

1
2
3
4
5
6
x = "Hello World!"
print(x[2:]) # 从索引2开始到字符串末尾: 'llo World!'
print(x[:2]) # 从字符串开头到索引2(不包含): 'He'
print(x[:-2]) # 从字符串开头到倒数第2个字符(不包含): 'Hello Worl'
print(x[-2:]) # 从倒数第2个字符到字符串末尾: 'd!'
print(x[2:-2]) # 从索引2到倒数第2个字符(不包含): 'llo Worl'

完整复制字符串

使用 [:] 可以创建字符串的浅拷贝:

1
2
3
x = "Hello World!"
print(x[:]) # 'Hello World!'
print(x == x[:]) # True

反向字符串

使用步长为 -1 可以实现字符串的反转:

1
print("Hello World!"[::-1])  # '!dlroW olleH'

选择间隔字符

可以通过设置步长来选择间隔字符:

1
print("H-e-l-l-o- -W-o-r-l-d"[::2])  # 'Hello World'

替代 Substr 函数

在其他语言中,Substr 函数通常接受起始位置和长度作为参数。在Python中,可以使用以下方式替代:

1
2
3
4
s = "Hello World!"
beginning = 2
LENGTH = 3
print(s[beginning:beginning + LENGTH]) # 'llo'

使用 Noneslice 对象

  • 可以使用 None 替代空值来指定“从开头”或“到结尾”,在函数中很有用:
1
2
3
4
def substring(s, start, end):
return s[start:end]

print(substring('abcde', 2, None)) # 'cde'
  • 还可以使用 slice 对象:
1
2
idx = slice(2, None)
print('abcde'[idx]) # 'cde'

使用变量进行切片

1
2
3
4
5
myString = 'Hello World'
end = 5
print(myString[2:end]) # 'llo'
print(myString[:end]) # 'Hello'
print(myString[end]) # ' '

提高代码可读性

使用 slice 对象可以提高代码的可读性:

1
2
3
4
5
string = "my company has 1000$ on profit, but I lost 500$ gambling."
EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final) # 500

使用 for 循环查找子串

可以使用 for 循环来查找给定子串是否存在于主字符串中:

1
2
3
4
5
6
7
main_string = "lullaby"
match_string = "ll"
match_string_len = len(match_string)
for index, value in enumerate(main_string):
sub_string = main_string[index:match_string_len + index]
if sub_string == match_string:
print("match string found in main string")

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 基本切片操作
x = "Hello World!"
print(x[2:])
print(x[:2])
print(x[:-2])
print(x[-2:])
print(x[2:-2])

# 完整复制字符串
print(x[:])

# 反向字符串
print(x[::-1])

# 选择间隔字符
print("H-e-l-l-o- -W-o-r-l-d"[::2])

# 替代 Substr 函数
s = "Hello World!"
beginning = 2
LENGTH = 3
print(s[beginning:beginning + LENGTH])

# 使用 None 和 slice 对象
def substring(s, start, end):
return s[start:end]
print(substring('abcde', 2, None))
idx = slice(2, None)
print('abcde'[idx])

# 使用变量进行切片
myString = 'Hello World'
end = 5
print(myString[2:end])
print(myString[:end])
print(myString[end])

# 提高代码可读性
string = "my company has 1000$ on profit, but I lost 500$ gambling."
EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)

# 使用 for 循环查找子串
main_string = "lullaby"
match_string = "ll"
match_string_len = len(match_string)
for index, value in enumerate(main_string):
sub_string = main_string[index:match_string_len + index]
if sub_string == match_string:
print("match string found in main string")

最佳实践

  • 当需要多次使用相同的切片范围时,建议使用 slice 对象,以提高代码的可读性和可维护性。
  • 在使用变量进行切片时,要确保变量的值符合预期,避免出现索引越界等错误。
  • 如果需要频繁进行子串查找操作,可以考虑使用Python的内置方法 infind 等,它们的效率通常比 for 循环更高。

常见问题

索引越界

如果 startstop 超出了字符串的索引范围,Python不会报错,而是会返回合理的结果。例如:

1
2
x = "Hello"
print(x[10:]) # ''

对切片操作理解不准确

初学者可能会混淆 startstop 的含义,记住 stop 对应的字符不包含在切片结果中。例如:

1
2
x = "Hello"
print(x[1:3]) # 'el',而不是 'ell'

Python中获取字符串子串的方法
https://119291.xyz/posts/2025-05-13.python-string-substring-methods/
作者
ww
发布于
2025年5月13日
许可协议