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() 函数和正则表达式方法,已经进行了非常详细的讨论,以使其更加清晰。