Python 中字符串中子字符串的第 N 次出现
Python 中的字符串用于存储一系列字符,以便我们可以对它们执行不同的操作。Python 中的子字符串是包含在另一个字符串中的一组字符。
在本文中,我们将提取子字符串在第 n 次之后出现的索引,并讨论在 Python 中查找子字符串的第 n 个索引的各种方法。
在这个例子中,我们得到一个字符串和一个子字符串以及值 n
,这样我们需要找到我们的子字符串在第 n 次之后出现在原始字符串中的索引。假设我们得到一个字符串 s
,子字符串 str
,其值为 n
。
示例代码:
s = "batpollbatsitbat"
str = "bat"
n = 2
输出:
7
我们需要返回我们的子字符串 "bat"
第二次出现在原始字符串中的索引。因此,我们将根据基于 0 的索引返回 7
作为输出。
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()
方法用于查找指定值第一次出现的索引。我们还可以在 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 有一个称为 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()
函数和正则表达式方法,已经进行了非常详细的讨论,以使其更加清晰。
相关文章
Django 中的 Slug
发布时间:2023/05/04 浏览次数:173 分类:Python
-
本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。
在 Django 中按降序过滤查询集中的项目
发布时间:2023/05/04 浏览次数:157 分类:Python
-
在这个讲解中,学习如何借助 Django 中的 order_by() 方法按降序过滤出查询集中的项目。
Django ALLOWED_HOSTS 介绍
发布时间:2023/05/04 浏览次数:181 分类:Python
-
本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。
Django 中的 Select_related 方法
发布时间:2023/05/04 浏览次数:129 分类:Python
-
本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。
使用 Post 请求将数据发送到 Django 服务器
发布时间:2023/05/04 浏览次数:159 分类:Python
-
在这篇关于Django的讲解中,我们简要介绍了post和get请求以及如何在Django中用post实现CSRF token。
Django 返回 JSON
发布时间:2023/05/04 浏览次数:106 分类:Python
-
在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。
在 Django 中创建对象
发布时间:2023/05/04 浏览次数:59 分类:Python
-
本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。
在 Django 中为多项选择创建字段
发布时间:2023/05/04 浏览次数:75 分类:Python
-
在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。