使用迭代但不是内置函数模拟Python str.find(substring)

时间:2014-07-12 02:42:14

标签: python string find substring

如何在不使用Python中的str.find()的情况下在字符串中找到子字符串的位置?我应该如何循环呢?

def find substring(string,substring):
     for i in xrange(len(string)):
        if string[i]==substring[0]:
          print i
        else: print false

例如,当string = "ATACGTG"substring = "ACGT"时,它应该返回2。我想了解str.find()的工作原理

3 个答案:

答案 0 :(得分:1)

您可以使用Boyer-MooreKnuth-Morris-Pratt。两者都创建表格以预先计算每次未命中的更快移动。 B-M页面有一个python实现。两个页面都引用其他字符串搜索算法。

答案 1 :(得分:0)

在不使用find的约束下,您可以改为使用str.index,如果找不到子字符串,则返回ValueError:

def find_substring(a_string, substring):
    try:
        print(a_string.index(substring))
    except ValueError:
        print('Not Found')

和用法:

>>> find_substring('foo bar baz', 'bar')
4
>>> find_substring('foo bar baz', 'quux')
Not Found

如果你必须循环,你可以这样做,沿着字符串滑动,并使用匹配的第一个字符,然后检查字符串的其余部分是否以子字符串开头,这是一个匹配:

def find_substring(a_string, substring):
    for i, c in enumerate(a_string):
        if c == substring[0] and a_string[i:].startswith(substring):
            print(i)
            return
    else: 
        print(False)

没有字符串方法:

def find_substring(a_string, substring):
    for i in range(len(a_string)):
        if a_string[i] == substring[0] and a_string[i:i+len(substring)] == substring:
            print(i)
            return
    else: 
        print(False)

在没有任何内置功能的情况下,我无法想办法。

答案 2 :(得分:0)

  

在没有任何内置功能的情况下,我想不出办法。

我可以:

def find_substring(string, substring):

    def starts_with(string, substring):
        while True:
            if substring == '':
                return True

            if string == '' or string[0] != substring[0]:
                return False

            string, substring = string[1:], substring[1:]

    n = 0

    while string != '' and substring != '':

        if starts_with(string, substring):
            return n

        string = string[1:]

        n += 1

    return -1

print(find_substring('ATACGTG', 'ACGT'))

即。避免使用内置len()range()等。如果不使用内置len(),我们就会失去一些效率,因为我们可以更快完成。 OP指定的迭代,上面使用,但递归变量更紧凑:

def find_substring(string, substring, n=0):

    def starts_with(string, substring):
        if substring == '':
            return True

        if string == '' or string[0] != substring[0]:
            return False

        return starts_with(string[1:], substring[1:])

    if string == '' or substring == '':
        return -1

    if starts_with(string, substring):
        return n

    return find_substring(string[1:], substring, n + 1)

print(find_substring('ATACGTG', 'ACGT'))