在使用 Python 处理字符串时,我们有时会遇到需要搜索子串的情况,但问题在于子串中可能包含一些缺失或未知的字符。我们需要在主字符串中找到能够匹配这种模式的子串。这项任务在许多领域都有广泛的应用。让我们来探讨几种可以完成此任务的方法。
方法 #1:使用 re.search()
这是执行此任务的方法之一。在这种方法中,我们利用正则表达式编译带有通配符的子串模式,并在主字符串中使用 search() 方法进行查找。
Python3
# Python3 代码演示通配符子串搜索的工作原理
# 使用 re.search()
import re
# 初始化字符串
test_str = ‘geeksforgeeks is best for geeks‘
# 打印原始字符串
print("原始字符串是:" + str(test_str))
# 初始化子串
sub_str = ‘..st‘
# 使用 re.search()
temp = re.compile(sub_str)
res = temp.search(test_str)
# 打印结果
print("子串匹配结果为:" + str(res.group(0)))
输出:
原始字符串是:geeksforgeeks is best for geeks
子串匹配结果为:best
方法 #2:使用 re.finditer()
这是解决此问题的另一种方法。使用这种方法,如果需要,我们还可以提取匹配项的位置信息。
Python3
# Python3 代码演示通配符子串搜索的工作原理
# 使用 re.finditer()
import re
# 初始化字符串
test_str = ‘geeksforgeeks is best for geeks‘
# 打印原始字符串
print("原始字符串是:" + str(test_str))
# 初始化子串
sub_str = ‘..st‘
# 使用 re.finditer()
temp = re.compile(sub_str)
res = temp.search(test_str)
# 打印结果
print("子串匹配结果为:" + str(res.group(0)))
输出:
原始字符串是:geeksforgeeks is best for geeks
子串匹配结果为:best
所有方法的时间和空间复杂度都是相同的:
时间复杂度: O(n)
空间复杂度: O(n)
方法 #3:
这是另一种使用 INLINECODEc5eec558 库和 INLINECODEc6cb9c82 方法的方法。它与 INLINECODE821a48e1 方法类似,但 INLINECODE26bfcb8c 会返回一个包含所有非重叠匹配项的列表,作为单独的字符串。
Python3
import re
# 初始化字符串
test_str = ‘geeksforgeeks is best for geeks‘
# 打印原始字符串
print("原始字符串是:" + str(test_str))
# 初始化子串
sub_str = ‘..st‘
# 使用 re.findall() 进行通配符子串搜索
temp = re.compile(sub_str)
res = temp.findall(test_str)
# 打印结果
print("子串匹配结果为:" + str(res))
# 代码贡献者:Edula Vinay Kumar Reddy
输出
原始字符串是:geeksforgeeks is best for geeks
子串匹配结果为:[‘best‘]
这种方法的时间和空间复杂度与前几种方法相同:
时间复杂度:O(n)
辅助空间:O(n)
方法 #4:使用 split(), replace(), endswith(), join() 方法
思路
- 使用 split() 分割给定的字符串。
- 将 substr 中的 INLINECODE6154686d 替换为空字符串(使用 replace())。
- 启动一个 for 循环来遍历列表。
- 检查元素的长度是否等于初始子串的长度,以及元素是否以替换后的子串结尾(使用 endswith())。
- 如果为真,则将这些元素追加到输出列表中。
- 最后拼接输出并显示(使用 join())。
Python3
# Python3 代码演示通配符子串搜索的工作原理
# 初始化字符串
test_str = ‘geeksforgeeks is best for geeks‘
# 打印原始字符串
print("原始字符串是:" + str(test_str))
# 初始化子串
sub_str = ‘..st‘
x = test_str.split()
res = []
y = len(sub_str)
sub_str = sub_str.replace(".", "")
for i in x:
if len(i) == y and i.endswith(sub_str):
res.append(i)
# 打印结果
print("子串匹配结果为:" + "".join(res))
输出
原始字符串是:geeksforgeeks is best for geeks
子串匹配结果为:best
时间复杂度:O(n)
辅助空间:O(n)
方法 #5:使用字符串切片和列表推导式
- 初始化字符串和要搜索的模式。
- 打印原始字符串。
- 使用列表推导式创建包含所有匹配模式的子串的列表。
a. 对于原始字符串中每个可能的起始索引 i,提取长度等于模式长度的子串。
b. 检查子串中的每个字符是否与模式中对应的字符匹配,或者模式字符是否为通配符 "."。
c. 如果所有字符都匹配或是通配符,则将该子串添加到匹配列表中。
- 如果至少有一个匹配项,打印第一个匹配项。
Python3
test_str = ‘geeksforgeeks is best for ge