Python IndexError:字符串索引超出子字符串程序的范围

时间:2014-06-29 01:52:57

标签: python regex string substring

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

基本上我的老师想要证明函数'在'中,如:

ana in banana将返回True。

该计划的目标是制作2个参数的函数,

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

当我在解释器' substring(" ana"," banana")'中调用该函数时,它在第5行打印出一个回溯错误字符串索引超出范围:

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

我试图找到错误。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

有几个单独的问题。

  1. 您没有在外循环的每次迭代中重置tracker。这意味着前一次迭代的剩余物会污染后来的迭代。
  2. 您没有使用range,而是循环遍历tuple 0以及每个字符串的长度。
  3. 您正在尝试增加外部计数器并跳过检查外部循环的迭代。
  4. 在尝试索引外部字符串之前,您没有正确检查边界。
  5. 以下是更正后的版本。

    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")
    

答案 1 :(得分:0)

首先,你的循环应该是

for i in xrange(0,(len(fullStr))):
例如,

。我在(0,len(fullStr)-1)中我将第一次接受值0,然后第二次接受len(fullStr)-1。我假设您的算法也希望它能够采用中间值。

现在,就错误而言,在for循环的最后一次传递中考虑ii将等于len(fullStr)-1。现在,当我们执行i+=1时,i现在等于len(fullStr)。这并没有满足i==len(fullStr)-1的条件,所以我们不会破坏,我们循环,然后崩溃。如果你在if i>=len(fullStr)-1声明之前做出i==len(fullStr)-1或检查if fullStr[i]==subStr[j]:,那会更好。

最后,虽然与具体问题无关,但每次停止查看某个匹配项时都不会重置tracker。您应该在tracker = ""行之后放置for i in xrange(0,(len(fullStr))):。从i开始循环遍历列表后,您也不会检查跟踪器是否正确,当您遇到不匹配时也不会从循环中断(而是继续并可能拾取更多匹配但不连续的字母。 )

以下是完全更正的版本:

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