2013-05-11 65 views
-1

我知道在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     
+0

你在寻找一种更好的/不同的方式来编写代码或更聪明的算法吗?从字面上看,显而易见的“实现”搜索的另一种方式是使用'in'运算符。有很多方法可以用不同的方式编写代码,其中一些方法在回复中指出。正如我的答案中指出的那样,您还可以使用更智能的算法来搜索子字符串。请澄清。 – user4815162342 2013-05-11 19:56:51

+0

我读了下来的解决方案,这是我的预期...如果你可以提供我更有效的算法PLZ做说兄弟会对我有用.... – abu 2013-05-12 12:15:04

+0

我的答案确实如此,但你需要自己编码。 – user4815162342 2013-05-12 21:08:48

回答

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检查的长度len(s)m每串并认为如果它等于s。如果是,则返回True并停止进一步处理(这称为“短路”,与上面的break非常相似)。

这里是any片会是什么样子,如果我们用一个列表理解取代了它,并拿出相等的比较:

In [4]: [m[i:i+len(s)] for i in range(len(m)-len(s)+1)] 
Out[4]: ['col', 'oll', 'lle', 'leg', 'ege'] 
+0

谢谢你兄弟....你实际上理解我的概率,并澄清我.... – abu 2013-05-12 11:58:04

+0

@abu没问题,祝你好运:) – RocketDonkey 2013-05-12 16:19:58

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

+0

哈哈,这是相当不错的,+1 – RocketDonkey 2013-05-11 19:18:33

2

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

这是一个很大的话题,你的问题并没有说清楚你实际上是什么样的信息。在Python的情况下,简单地使用in运算符以及相关方法str.findstr.index当然最有效,所有这些方法都会部署simplified Boyer-Moore

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功能,带“长”的字符串,每次 - s失去它的头,直到你要么在第一位置找到subss变得比subs短。

+0

谢谢你为我提供了一个很好的递归解决方案.... – abu 2013-05-12 11:59:57