这看起来应该是非常微不足道的,但我是 Python 的新手,想以最 Pythonic 的方式来做。
我想找到与字符串中第 n 次出现的子字符串对应的索引。
必须有一些等同于我想做的事情
mystring.find("substring", 2nd)
如何在 Python 中实现这一点?
原文由 prestomation 发布,翻译遵循 CC BY-SA 4.0 许可协议
这看起来应该是非常微不足道的,但我是 Python 的新手,想以最 Pythonic 的方式来做。
我想找到与字符串中第 n 次出现的子字符串对应的索引。
必须有一些等同于我想做的事情
mystring.find("substring", 2nd)
如何在 Python 中实现这一点?
原文由 prestomation 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是直接迭代解决方案的更 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
方法:
原文由 Todd Gamblin 发布,翻译遵循 CC BY-SA 2.5 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
2 回答861 阅读✓ 已解决
我认为 Mark 的迭代方法是通常的方法。
这是字符串拆分的替代方法,它通常可用于查找相关进程:
这是一个快速的(有点脏,因为你必须选择一些无法匹配针的箔纸)单线: