重新创建内置的s.find('substring')函数

时间:2014-03-02 22:08:28

标签: python python-3.x

我正在尝试重新创建s.find('substring')函数。我遇到的两个问题如下:
1)找到起始索引的能力,例如:

Enter a phrase please"my best test ever!"
Enter a word you wish to find"best"
found first instance of letter at,  0
found first instance of letter at,  19
>>> 

2)假设找到了正确的索引,我希望此代码段指示是否或 并非整个子字符串都在字符串中:

str2 in str1[i:len(str1)]

每当我在空闲时独立于主循环测试它时,它就无法正常工作。

这是我的主要代码:

str1 = input("Enter a phrase please")
str2 = input("Enter a word you wish to find")




for i in range(len(str1)):
    if str2[0] == str1[i]:
        print("found first instance of letter at, ", i)
        str2 in str1[i:len(str1)]

非常感谢任何建议,谢谢伙伴们!

2 个答案:

答案 0 :(得分:2)

你的循环应该可以正常工作,但你没有对str2 in str1[..]测试做任何事情,也没有正确计算终点;你想在这里使用str2的长度,真的。

您可以直接在str1上循环,并使用enumerate() function添加索引。您需要len(str2)结果添加到i以查找端点,并使其打印出测试结果;我在这里使用了==,因为结果切片应该是相同的字符串

for i, char in enumerate(str1):
    if str2[0] == char:
        print("found first instance of letter at,", i)
        print(str2 == str1[i:i + len(str2)])

演示:

>>> str1 = 'my best test ever!'
>>> str2 = 'best'
>>> for i, char in enumerate(str1):
...     if str2[0] == char:
...         print("found first instance of letter at, ", i)
...         print(str2 == str1[i:i + len(str2)])
... 
found first instance of letter at,  3
True

答案 1 :(得分:0)

如果您想要一个不使用Python提供的任何精彩工具的算法演示,请查看Knuth-Morris-Pratt方法。

这里,粗略地用Python实现,好像Python是Assembly:

  #0         1         2
  #0123456789012345678901234
S='dcdcacdcdeerecdabcddfdabc'
W=               'abc' # ^^^
m=0
i=0
while True:
    if m+i==len(S):
        break   
    if W[i]==S[m+i]:
        if i==len(W)-1:
            print 'MATCH!', m
            i=0
            m+=1
        else:
            i+=1
    else:
        i=0
        m+=1

打印:

MATCH! 15
MATCH! 22
相关问题