Python 中字符串中子字符串的第 N 次出现
- 在 Python 中查找字符串中子字符串的第 N 次出现
-
在 Python 中使用
split()
方法计算子字符串的第 N 次出现 -
在 Python 中使用
find()
方法查找子字符串的第 N 次出现 - 在 Python 中使用正则表达式查找子字符串的第 N 次出现
- 结论
Python 中的字符串用于存储一系列字符,以便我们可以对它们执行不同的操作。Python 中的子字符串是包含在另一个字符串中的一组字符。
在本文中,我们将提取子字符串在第 n 次之后出现的索引,并讨论在 Python 中查找子字符串的第 n 个索引的各种方法。
在 Python 中查找字符串中子字符串的第 N 次出现
在这个例子中,我们得到一个字符串和一个子字符串以及值 n
,这样我们需要找到我们的子字符串在第 n 次之后出现在原始字符串中的索引。假设我们得到一个字符串 s
,子字符串 str
,其值为 n
。
示例代码:
s = "batpollbatsitbat"
str = "bat"
n = 2
输出:
7
我们需要返回我们的子字符串 "bat"
第二次出现在原始字符串中的索引。因此,我们将根据基于 0 的索引返回 7
作为输出。
在 Python 中使用 split()
方法计算子字符串的第 N 次出现
Python 的 split()
方法用于通过指定的分隔符将给定的字符串拆分为字符串列表。但是,我们可以显式指定分隔符(空格),我们需要在其中打破字符串。
split()
函数还采用第二个参数作为参数 maxsplit
,用于指定在找到子字符串后需要中断字符串的次数。
在下面的示例中,我们需要将字符串 n
次拆分,其中 n
是问题中给出的第 n 次出现。
示例代码:
def solve(s, str, n):
sep = s.split(str, n)
if len(sep) <= n:
return -1
return len(s) - len(sep[-1]) - len(str)
print(solve("foobarfobar akfjfoobar afskjdffoobarruythfoobar", "foobar", 2))
输出:
16
我们在上面的程序中有一个函数 solve()
,它的主要逻辑已经实现。第一行使用 split()
函数,其中子字符串 str
作为分隔符传递,n
的值作为 maxsplit
的值传递。
在这一行之后,我们的字符串 s
被分解成一个字符串列表。存储在 sep
变量中的字符串列表根据以下示例中的输入进行分隔。
["", "fobar akfj", " afskjdffoobarruythfoobar"]
原始字符串在我们找到子字符串 str
的索引处分隔。但是,由于 n
的值,这种拆分只发生了两次。
sep
变量中存储的最后一个字符串在某些索引处与我们的子字符串匹配,但我们没有将它们分开。
在 split()
函数之后,我们检查了一个条件,即 sep
变量的长度是否大于 n
的值,因为如果存在用户试图搜索第 n 次出现的情况对于不存在 n
次的子字符串,在这种情况下,我们需要返回 -1
。
现在是我们的主要逻辑,计算子字符串第 n 次出现的索引,并且我们只将字符串分隔了 n
次。因此,在第 n 次出现子字符串之后可能留下的字符串被存储为 sep
变量的最后一个元素。
因此,我们用 sep
变量中存在的最后一个字符串的长度减去原始字符串 s
的长度,该变量以 sep[-1]
访问。
这给出了我们想要的子字符串的出现结束的索引,但是由于我们需要起始索引,我们也将减去子字符串的长度。
通过这种方式,我们可以计算出第 n 次出现的子字符串的索引。
在 Python 中使用 find()
方法查找子字符串的第 N 次出现
Python 中的 find()
方法用于查找指定值第一次出现的索引。我们还可以在 find()
函数中指定开始和结束索引。
这些开始和结束索引告诉我们将搜索限制在指定范围内。
示例代码:
s = "xyxyxyxybvxy"
str = "xy"
n = 4
x = -1
for i in range(0, n):
x = s.find(str, x + 1)
print("Nth occurrence is at", x)
输出:
Nth occurrence is at 6
我们对字符串 s
应用了 find()
函数,它将在每次迭代中找到原始字符串中子字符串的第一次出现。
在我们的代码中,在第一次迭代中,由于 x
的值(最初是 -1
),原始字符串将从 0th
索引搜索到末尾,但是在 find()
函数中,它变为 x+1 = -1+1 = 0
)。
此迭代将使我们在原始字符串中首次出现子字符串。然而,第二次迭代将从索引 1
搜索字符串到末尾(因为 x
在前一次迭代中变为 0
并且 find()
函数变为 x+1 = 0+1 = 1
)。
此迭代将为我们提供第二次出现的子字符串。我们可以进行这样的 n
次迭代来找到字符串的第 n 次出现。
在 Python 中使用正则表达式查找子字符串的第 N 次出现
正则表达式用于在字符串中查找特定模式,它是一个字符序列,可以让我们形成搜索模式。Python 有一个称为 re
的正则表达式包。
我们将使用 re
包来查找第 n 次出现的子字符串。
示例代码:
import re
s = "yoofpofbof"
n = 3
result = [m.start() for m in re.finditer(r"of", s)]
if len(result) <= n:
print(result[n - 1])
输出:
8
我们在第一行导入了 re
包以使用上述代码中的正则表达式。之后,我们的输入就被定义了。
我们使用 re
包中的 finditer()
方法,它为我们提供了原始字符串中所有匹配子字符串的开始和结束索引,但我们只需要开始索引即可找到第 n 次出现。
因此,我们使用 m.start()
方法,它只会给我们匹配的子字符串的起始索引。
我们使用 for
循环查找子字符串的所有起始索引并将它们存储在 result
变量中。现在,如果用户提供了不在字符串中的 n
的值,它将抛出错误,因为我们检查了结果列表的长度和 n
变量之间的条件。
最后,我们打印子字符串第 n 次出现的索引。
结论
在本教程中,我们讨论了三种不同的方法来查找字符串中第 n 次出现的子字符串。这些方法,如 find()
函数、split()
函数和正则表达式方法,已经进行了非常详细的讨论,以使其更加清晰。