3 回答
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')
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:
简单胜于复杂。
扁平比嵌套更好。
可读性很重要。
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)
添加回答
举报