查找子字符串的方法

时间:2013-05-11 18:59:05

标签: python python-2.7

我知道在python中有一个in运算符,可用于检查字符串中是否存在任何子字符串或字符。我想通过检查每个字符串(长度子字符串)来做到这一点。下面的代码是唯一的方法,还是有其他方法可以实现这个目标?

m = "college"
s = "col"
lm = len(m)
ls = len(s)
f = 0

for i in range(lm):    
    if (i+ls) <= lm:
        if s == m[i:(i+ls)]:            
            global f
            f = 1
            break
if f:
    print "present"
else:
    print "not present"

我在这里做的是如果我的子字符串是col,我的程序通过从主字符串的开头到结尾移动来检查带有子字符串的长度子字符串的字符串并返回true或不

col
oll
lle
leg
ege                

4 个答案:

答案 0 :(得分:2)

您的代码是快速实现常规子字符串搜索的合法方式,但不是唯一的。更有效的算法包括Boyer-Moore string searchKnuth-Morris-Pratt search或使用DFA实施的搜索。

这是一个很大的主题,你的问题并没有说明你实际上是在追求什么样的信息。对于Python,当然最简单的方法是使用in运算符以及相关方法str.findstr.index,所有这些都部署simplified Boyer-Moore

答案 1 :(得分:1)

您可以尝试这样的事情:

In [1]: m = 'college'

In [2]: s = 'col'

In [3]: if any(m[i:i+len(s)] == s for i in range(len(m)-len(s)+1)):
   ...:     print 'Present'
   ...: else:
   ...:     print 'Not present'
   ...:     
Present

any检查长度为m的{​​{1}}的每个子字符串,并查看它是否等于len(s)。如果是,则返回s并停止进一步处理(这称为“短路”,与上面的True非常相似)。

如果我们用列表理解替换它并取出相等比较,那么break片段会是什么样子:

any

答案 2 :(得分:1)

那里你不需要global。另外,你可以做到

In [1]: %paste
m = "college"
s = "col"

In [2]: 'not ' * all(s != m[i:i+len(s)] for i in range(1+len(m)-len(s))) + 'present'
Out[2]: 'present'

但实际上你当然应该做s in m

答案 3 :(得分:0)

这种问题需要功能性解决方案:

def strcomp(s, subs):
    if len(s) < len(subs):
        return False
    elif s[0:len(subs)] == subs:
         return True
    else:
        return strcomp(s[1:], subs)

您递归调用strcomp函数,每次使用“long”字符串 - s失去理智,直到您在第一个位置找到subss变得比subs短。