-
慕的地6264312
我认为,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')
-
慕码人8056858
这是简单的迭代解决方案的更多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:简单胜于复杂。扁平比嵌套更好。可读性很重要。
-
互换的青春
这将在字符串中找到子字符串的第二次出现。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)