为了账号安全,请及时绑定邮箱和手机立即绑定

查找字符串中子字符串的第n次出现

查找字符串中子字符串的第n次出现

炎炎设计 2019-10-28 18:39:56
这似乎应该是微不足道的,但是我是Python的新手,并且想以最Python的方式来做。我想在字符串中找到子字符串的第n次出现。一定有什么我想做的事情是mystring.find("substring", 2nd)如何在Python中实现?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

我认为,Mark的迭代方法将是通常的方法。


这是字符串拆分的替代方法,通常可用于查找相关过程:


def findnth(haystack, needle, n):

    parts= haystack.split(needle, n+1)

    if len(parts)<=n+1:

        return -1

    return len(haystack)-len(parts[-1])-len(needle)

这是一种快速(有点脏,因为您必须选择一些无法与针头相匹配的谷壳)的单缸套:


'foo bar bar bar'.replace('bar', 'XXX', 1).find('bar')


查看完整回答
反对 回复 2019-10-28
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

这是简单的迭代解决方案的更多Pythonic版本:


def find_nth(haystack, needle, n):

    start = haystack.find(needle)

    while start >= 0 and n > 1:

        start = haystack.find(needle, start+len(needle))

        n -= 1

    return start

例:


>>> find_nth("foofoofoofoo", "foofoo", 2)

6

如果要查找的第n个重叠出现needle,可以用1代替,增加len(needle),如下所示:


def find_nth_overlapping(haystack, needle, n):

    start = haystack.find(needle)

    while start >= 0 and n > 1:

        start = haystack.find(needle, start+1)

        n -= 1

    return start

例:


>>> find_nth_overlapping("foofoofoofoo", "foofoo", 2)

3

这比Mark的版本更容易阅读,并且不需要拆分版本或导入正则表达式模块的额外内存。与各种方法不同,它还遵守python Zen中的一些规则re:


简单胜于复杂。

扁平比嵌套更好。

可读性很重要。


查看完整回答
反对 回复 2019-10-28
?
互换的青春

TA贡献1797条经验 获得超6个赞

这将在字符串中找到子字符串的第二次出现。


def find_2nd(string, substring):

   return string.find(substring, string.find(substring) + 1)

编辑:我对性能没有考虑太多,但是快速递归可以帮助找到第n个出现的情况:


def find_nth(string, substring, n):

   if (n == 1):

       return string.find(substring)

   else:

       return string.find(substring, find_nth(string, substring, n - 1) + 1)


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 778 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信