创建自己的查找字符串函数

时间:2014-02-18 21:09:54

标签: python string python-3.x

对于学校项目,我必须创建一个名为find_str的函数,该函数与.find字符串方法基本相同,但我们不能在定义中使用任何字符串方法。

项目描述如下:“函数find_str有两个参数(两个字符串)。它返回在第一个参数中找到第二个参数的最低索引(如果在第一个参数中找不到第二个参数,则返回-1) )“。

我花了很多时间在这个项目上工作,还没有找到解决方案。这是我提出的当前定义:

def find_str (string, substring):
    index = 0
    length = len (substring)
    for ch in string:
        if ch == substring [0]:
            subindex1 = 0
            subindex2 = index
            for i in range (length):
                if ch == substring [i]:
                    subindex1 +=1
                    if subindex1 == length:
                        return index
                    ch = string [(subindex2)+1]
                    subindex2 +=1
        index += 1
    return "-1"

此代码示例仅适用于某些情况,但不是全部。

例如:

print (find_str ("hello", "llo"))

返回:

2

应该如此。

但是

print (find_str ("hello", "el"))

返回:

   ch = string [(subindex2)+1]
IndexError: string index out of range

我觉得我在思考这个问题,必须有一个更简单的方法来做到这一点。任何输入或帮助都会很棒!谢谢。

3 个答案:

答案 0 :(得分:1)

FF使用子功能来清除您的想法通常会有所帮助。

def find_str (string, substring):
    index = 0
    length = len (substring)
    for j in range(len(string)):
        if is_next_sub(string, substring, j):
            return j        
    return "-1"

def is_next_sub(string, substring, index):
    for i in range(len(substring)):
        if substring[i] != string[index + i]:
            return False
    return True

答案 1 :(得分:1)

我不确定我们是否应该帮助你完成'家庭作业'

这个怎么样:

def find_str(string, substring):
    for off in xrange(len(string)):
        if string[off:].startswith(substring):
            return off
    return -1

答案 2 :(得分:0)

我没有仔细检查您的代码,但看起来您正在尝试比较不存在的字符。

假设您正在搜索“aaaaa”中的子字符串“aaa”,并且您需要查找所有匹配项...

String     : aaaaa
Match at 0 : aaa..
Match at 1 : .aaa.
Match at 2 : ..aaa

即使字符总是匹配,并且字符串中有五个字符,您可能只需要考虑三个位置。

因此,在您查看实际字符之前,您可以根据字符串和子字符串的长度来限制您可能需要考虑的起始位置数。你只循环那些起始位置。这意味着你没有循环无法匹配的起始位置。此外,如果你这样做......

String     : aaaaa
Match at 0 : aaa..
Match at 1 : .aaa.
Match at 2 : ..aaa
Match at 3 : ...aa!
Match at 4 : ....a!!

这些感叹号是在字符串结束后尝试将子字符串中的字符与不存在的字符匹配的位置。你可以在循环中检查它,以避免每次出现错误,但为什么不通过不循环不能发生的匹配位置一次性消除所有这些情况?

您可能需要检查的起始位置数为len(fullstring) + 1 - len(substring),因此您可以使用range(0, len(fullstring) + 1 - len(substring))导出一系列可能的起始位置。