2010-09-09 120 views
6

我想創建一個函數來檢查字符串中是否存在其他字符串。
但是,正在檢查的子字符串可能會在主字符串中被其他字母打斷。在字符串中查找字符串的子序列

例如:

a = 'abcde' 
b = 'ace' 
c = 'acb' 

有問題的函數應該返回爲b正在a,但不c。我試過set(a)。已經設置了交集(set(b)),我的問題是它返回c,因爲它在a中。

+0

這些類型的字符串分別被稱爲子序列(HTTP://en.wikipedia。 org/wiki/Subsequence)更長的字符串。 – Lazer 2010-09-11 12:59:13

+0

這個問題是一個特例http://stackoverflow.com/questions/6877249/find-the-number-of-occurrences-of-a-subsequence-in-a-string那裏的解決方案更有效地解決這種情況也是如此。 – Amoss 2014-04-06 08:42:43

回答

11

你可以把你的預期序列爲正則表達式:

import re 

def sequence_in(s1, s2): 
    """Does `s1` appear in sequence in `s2`?""" 
    pat = ".*".join(s1) 
    if re.search(pat, s2): 
     return True 
    return False 

# or, more compactly: 
def sequence_in(s1, s2): 
    """Does `s1` appear in sequence in `s2`?""" 
    return bool(re.search(".*".join(s1), s2)) 

a = 'abcde' 
b = 'ace' 
c = 'acb' 

assert sequence_in(b, a) 
assert not sequence_in(c, a) 

「王牌」被變成了正則表達式。「一* C * E」,它發現在序列這三個字符,可能介入字符。

+0

感謝您的及時答覆! – 2010-09-09 03:05:49

5

如何對這樣的事情...

def issubstr(substr, mystr, start_index=0): 
    try: 
     for letter in substr: 
      start_index = mystr.index(letter, start_index) + 1 
     return True 
    except: return False 

或...

def issubstr(substr, mystr, start_index=0): 
    for letter in substr: 
     start_index = mystr.find(letter, start_index) + 1 
     if start_index == 0: return False 
    return True 
+0

我預計這會比基於正則表達式的答案運行得更快。你有時間嗎? – 2010-09-09 04:19:03

+0

不是沒有時機,只是寫它作爲替代。 – 2010-09-09 04:24:53

3
def issubstr(s1, s2): 
    return "".join(x for x in s2 if x in s1) == s1 

>>> issubstr('ace', 'abcde') 
True 

>>> issubstr('acb', 'abcde') 
False 
+0

請說明空白的意見。 – 2010-09-09 15:47:41

+1

問題是要找到子序列,而不是子串 – gizmo 2012-11-09 07:00:25