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

新手上路,请多包涵

这看起来应该是非常微不足道的,但我是 Python 的新手,想以最 Pythonic 的方式来做。

我想找到与字符串中第 n 次出现的子字符串对应的索引。

必须有一些等同于我想做的事情

mystring.find("substring", 2nd)

如何在 Python 中实现这一点?

原文由 prestomation 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 429
2 个回答

我认为 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')

原文由 bobince 发布,翻译遵循 CC BY-SA 2.5 许可协议

这是直接迭代解决方案的更 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

如果要查找 needle 的第 n 次 重叠 出现,可以递增 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 之禅中 的一些规则,不同于各种 re 方法:

  1. 简单胜于复杂。
  2. 扁平比嵌套好。
  3. 可读性很重要。

原文由 Todd Gamblin 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题