字串匹配的python實現

2022-09-14 01:51:09 字數 1294 閱讀 2684

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

一、暴力匹配演算法

如果要匹配乙個字串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演算法

參見:簡單來說,就是當匹配字串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)) #

得到相同前字尾

ifintersection:

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

ifmatch:

return

true

#kmp

ifj:

i += j -pmt(p[:j])

else: i += 1

return false

以上**參考

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

實現樸素的字串匹配

實現函式int findsubstr char t,char p 相關知識 在乙個長字串中尋找乙個短字串出現的位置,這是字串匹配問題。例如 長字串是 string 短字串是 ring 那麼短字串在長字串 現的位置是 2 即 ring 在 string 現的開始位置是 2 include includ...

shell字串匹配的實現

一 簡介 bash shell提供了很多字串和檔案處理的命令。如awk expr grep sed等命令,還有檔案的排序 合併和分割等一系列的操作命令。grep sed和awk內容比較多故單獨列出,本文只涉及字串的處理和部分文字處理命令。二 字串處理 1 expr命令 expr引出通用求值表示式,可...

典型字串匹配演算法實現 單字串匹配演算法

部落格源址 相信大家對快捷鍵ctrl f是做什麼用的都應該很熟悉了,無論是文字編輯 網頁瀏覽等程式上它都意味著字串搜尋,我們提供乙個關鍵字,它將找到當前頁面上的所有該關鍵字所在的位置。關鍵字稱為模式串,在文字t中尋找模式串p出現的所有出現的位置,解決這種問題的演算法叫做字串匹配演算法。字串匹配演算法...