python字串以及他的匹配演算法

2021-08-28 18:41:42 字數 1493 閱讀 4706

對於python字串的實現來說,它本身是乙個線性表,根據前面我們講過的關於線性表的主體,我們可以實現乙個字串物件,在這裡我們需要說明的是,python字串是乙個不可變的物件,而且它的實現是乙個一體式的順序表的實現(概念見前面文章)

所以,對於乙個字串的物件,它除了有字元儲存空間外還有字串長度和一些配置資訊的空間。(注意一點:python沒有字元物件,單個字元也認為是乙個字串物件)

所以對於字串的長度len函式和按下標取值複雜度都是o(1),但是其他的操作,如字串的複製,切片等,都是o(n)。

再講一下字串的複製(切片)的過程,這些過程都會建立乙個新的字串,python首先會計算出所需要儲存空間的大小,然後乙個個的計算出要儲存再空間裡的字串。這是python字串複製(切片)的乙個過程。

對於字串中子串的查詢,是乙個高深的問題,當前的演算法實現中經典的有兩種,一種是樸素匹配演算法,一種是無回溯的kmp演算法。

接下來我們將樸素的匹配演算法。

過程是:

目標字串t, 模式字串p。

將p中的字元依次跟t中的比較,如果有乙個不匹配,將t字元移到下一位, 再講p中的字元乙個個的匹配,知道返回t中與p匹配的字串。

這裡有兩種實現方法,一種返回第乙個匹配的子串,另一種返回左右匹配子串的首字元的位置。實現如下:

#第一種

def *****_matching(t, p):

# 這種找出第乙個子串匹配的位置

m, n = len(p), len(t)

i, j = 0, 0

while i < m and j < n:

if p[i] == t[j]:

i, j = i + 1, j + 1

else:

i, j = 0, j-i+1

if i == m:

return j -i

return -1

print(*****_matching('fwekfwe', 'we'))

>>> 1

第二種

def *****_matching(t, p):

list =

# 用於儲存匹配子串的首字元位置

for i in range(len(t)):

x, z, times = i, 0, len(p)

if p[z] == t[i]:

while times > 1:

z += 1

x += 1

if p[z] != t[x]:

break

times -= 1

else:

# 當while/for迴圈正常退出時才會執行相應的else語句塊

return list

# 這種匹配可以找出所有匹配子串的位置

print(*****_matching('rewwwtrtwewrfrwe', 'ww'))

>>> [2, 3]

Python 字串匹配 match

import reprint re.match abc abc 匹配,左邊第乙個開始算起來,print re.match xabc abc 匹配不成功返回none,匹配成功返回位置詳細資訊print re.match abc xabc print re.match abc abcx import r...

python 字串匹配問題

想匹配html 安裝最新版python 各種資料庫的注釋 中的 56845037 和 59120585 嘗試用正則 pattern l r re.findall pattern l,html 結果不成功。返回為空,有用 soup beautifulsoup html,lxml print soup....

字串匹配的python實現

所有字串匹配演算法的核心問題是,當出現不匹配時,如何向後移動模式串 一 暴力匹配演算法 如果要匹配乙個字串s 和乙個模式串p,則從i 0開始依次匹配s i i len p 簡單粗暴,如下 def matcher t,p param t the string to check param p patt...