2010-09-09 40 views
6

Tôi muốn tạo một hàm kiểm tra chuỗi cho các lần xuất hiện của các chuỗi khác bên trong chúng.
Tuy nhiên, các chuỗi phụ đang được kiểm tra có thể bị gián đoạn trong chuỗi chính bằng các chữ cái khác.Tìm chuỗi các chuỗi trong các chuỗi

Ví dụ:

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

Chức năng trong câu hỏi phải trả lại như b là trong a, nhưng không c.

Tôi đã thử set(a). giao lộ (set (b)) đã có, và vấn đề của tôi với nó là nó trả về c như đang ở trong a.

+0

Những loại dây này được gọi là [subsequences] (http: //en.wikipedia. org/wiki/Hậu quả) của chuỗi dài hơn. – Lazer

+0

Câu hỏi này là trường hợp đặc biệt của http://stackoverflow.com/questions/6877249/find-the-number-of-occurrences-of-a-subsequence-in-a-string Các giải pháp có hiệu quả hơn để giải quyết trường hợp này là tốt. – Amoss

Trả lời

11

Bạn có thể bật chuỗi mong đợi của bạn thành một regex:

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) 

"át chủ bài" bị biến thành regex ". Một * c * e", mà tìm thấy những ba nhân vật theo thứ tự, với can thiệp càng tốt nhân vật.

+0

Cảm ơn câu trả lời nhanh chóng! –

5

thế nào về một cái gì đó như thế này ...

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 

hoặc ...

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

Tôi hy vọng điều này sẽ chạy nhanh hơn câu trả lời dựa trên regex. Bạn có timings? –

+0

Không có thời gian, chỉ cần viết nó như là một thay thế. –

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

Giải thích bình luận không gian trắng. –

+1

Câu hỏi đặt ra là tìm chuỗi, không phải chuỗi con – gizmo

Các vấn đề liên quan