Python索引器错误:子字符串程序中的字符串索引超出范围

Python索引器错误:子字符串程序中的字符串索引超出范围,python,regex,string,substring,Python,Regex,String,Substring,我正在为一个类编写代码,该类希望我编写一个代码,使用嵌套循环检查字符串中的子字符串 基本上,我的老师想证明函数“in”是如何实现的,如: 香蕉中的安娜将返回真值 该程序的目标是生成两个参数的函数 substring(subStr,fullStr) 这将打印出一句话,如果subStr是fullStr的子字符串,我的程序如下: def substring(subStr,fullStr): tracker="" for i in (0,(len(fullStr)-1)):

我正在为一个类编写代码,该类希望我编写一个代码,使用嵌套循环检查字符串中的子字符串

基本上,我的老师想证明函数“in”是如何实现的,如:

香蕉中的安娜将返回真值

该程序的目标是生成两个参数的函数

substring(subStr,fullStr)
这将打印出一句话,如果subStr是fullStr的子字符串,我的程序如下:

def substring(subStr,fullStr):
    tracker=""
    for i in (0,(len(fullStr)-1)):
        for j in (0,(len(subStr)-1)):
            if fullStr[i]==subStr[j]:
                tracker=tracker+subStr[j]
                i+=1
            if i==(len(fullStr)-1):
                break
    if tracker==subStr:
        print "Yes",subStr,"is a substring of",fullStr
当我调用解释器“substringana,banana”中的函数时,它在第5行打印出一个回溯错误,表示字符串索引超出范围:

if fullStr[i]==subStr[j]:

我拼命想找出错误。任何帮助都将不胜感激

这里有几个单独的问题

在外循环的每次迭代中,都不会重置跟踪器。这意味着以前迭代的剩余部分会污染以后的迭代。 您没有使用range,而是在仅包含0和每个字符串长度的元组上循环。 您正在尝试递增外部计数器并跳过外部循环迭代的检查。 在尝试索引到外部字符串之前,没有正确执行边界检查。 这是一个正确的版本

def substring(subStr,fullStr):
    for i in range(0,(len(fullStr))):
        tracker=""
        for j in range(0,(len(subStr))):
            if i + j >= len(fullStr):
               break
            if fullStr[i+j]==subStr[j]:
                tracker=tracker+subStr[j]
        if tracker==subStr:
            print "Yes",subStr,"is a substring of",fullStr
            return

substring("ana", "banana")

首先,您的循环应该是

for i in xrange(0,(len(fullStr))):
比如说。i在0中,lenfullStr-1将让我第一次接受0的值,然后第二次接受lenfullStr-1。我假设通过你的算法,你希望它也具有中间值

现在,关于错误,请考虑我在for循环的最后一次传递。我将等于lenfullStr-1。现在当我们执行i+=1时,i等于lenfullStr。这并没有满足i==lenfullStr-1的条件,所以我们不会中断、循环和崩溃。如果您在if-fullStr[i]==subStr[j]:语句之前选择了if>=lenfullStr-1或检查了i==lenfullStr-1,则会更好

最后,虽然与问题无关,但您不会在每次停止检查某个匹配项时重置跟踪程序。您应该将tracker=放在xrange0中的for i后面,lenfullStr:line。在从i开始循环遍历列表后,您也不会检查tracker是否正确,当您得到一个不匹配的字符时,也不会中断循环,而是继续并可能拾取更多匹配的字母,但不是连续的

以下是一个完全更正的版本:

def substring(subStr,fullStr):
    for i in xrange(0,(len(fullStr))):
        tracker="" #this is going to contain the consecutive matches we find
        for j in xrange(0,(len(subStr))):
            if i==(len(fullStr)): #end of i; no match.
                break
            if fullStr[i]==subStr[j]: #okay, looks promising, check the next letter to see if it is a match,
                tracker=tracker+subStr[j]
                i+=1
            else: #found a mismatch, leave inner loop and check what we have so far.
                break
        if tracker==subStr:
            print "Yes",subStr,"is a substring of",fullStr
            return #we already know it is a substring, so we don't need to check the rest

在第5行之前放上打印i,j,然后查看结果。不要增加i-for循环正在增加i,为您添加一些打印,以显示您的程序在循环中做了什么,您可能会更好地了解发生了什么以及哪里出错。正如furas所说,我将打印i,j放在第5行之前,然后,我也像karthikr说的那样,为我保留了增量。程序运行了,我不知道为什么程序跳过了j的元素1,在检查了0之后直接转到了2。谢谢你的回答。谢谢,你的回答真的很有帮助。我是一名初级程序员,大学第一学期。对不起,如果我犯了愚蠢的错误,这也是我第一次使用stackoverflow帐户。在这里学到了很多。@user3786963,这不是问题。您在描述问题和向我们展示您的尝试方面做得相当好。