字串匹配的python實現

來源:互聯網
上載者:User

標籤:

所有字串匹配演算法的核心問題是,當出現不匹配時,如何向後移動模式串

一、暴力匹配演算法

    如果要匹配一個字串s 和一個模式串p,則從i=0開始依次匹配s[i:(i+len(p))],簡單粗暴,代碼如下:

def matcher(t, p):    # param t: the string to check    # param p: pattern    n = len(t)    m = len(p)    for i in xrange(0, n-m+1):        if p == t[i:i+m]: return True

 二、KMP演算法

    參見:http://blog.csdn.net/v_july_v/article/details/7041827

    簡單來說,就是當匹配字串s和模式串p時,當s[i]和p[j]不匹配時,不回溯S,而是將p右移一定位元開始匹配。所右移位元由以下規則確定:若p[j]前面的字串最大長度的前尾碼相同的字串長度為L, 則右移(已匹配字串長度—L),文字描述比較抽象,參見上面部落格內容

def pmt(s):    """    PartialMatchTable    """    prefix = [s[:i+1] for i in range(len(s)-1)]    postfix = [s[i+1]: for i in range(len(s)-1)]    intersection = list(set(prefix) & set(postfix))    # 得到相同前尾碼    if intersection:        return len(intersection[0])    # 得到最長前尾碼    return odef kmp(t, p):    # t: the string to check    # p: pattern    i = 0    while i < len(t) - len(p) + 1:        match = True        for j in range(len(p)):            if t[i+j] != p[j]:                match = False                break            if match:                return True            # kmp            if j:                i += j - pmt(p[:j])            else: i += 1        return False

以上代碼參考http://cnblogs.com/goodspeed/p/3295456.html

另外,還有BM演算法,sunday演算法以及horspool演算法,後兩種是遷移中的變種,“BM演算法在實際應用中比KMP演算法快三到五倍”。

字串匹配的python實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.