演算法 回溯篇 第3節 正規表示式問題

2021-10-05 08:13:34 字數 2247 閱讀 7364

【演算法】【回溯篇】第1節:八皇后問題

【演算法】【回溯篇】第2節:解數獨問題

【演算法】【回溯篇】第3節:正規表示式問題

【演算法】【回溯篇】第4節:全排列問題

【演算法】【回溯篇】第5節:組合問題

【演算法】【回溯篇】第6節:子集問題

【演算法】【回溯篇】第7節:0-1揹包問題

假設正表示式中只包含∗

*∗和?

??這兩種萬用字元, 其中,∗

*∗匹配任意多個(大於等於0個)任意字元,?

??匹配零個或者乙個任意字元。基於以上背景假設,如何判斷乙個給定的文字,能否跟給定的正規表示式匹配?

剪枝策略:一旦出現匹配的情形,則直接停止遞迴,返回true。

結算情形:正規表示式到結尾了

class

regex()

:def

__init__

(self, pattern, text)

: self.pattern = pattern

self.plen =

len(self.pattern)

self.text = text

self.tlen =

len(self.text)

self.matched =

false

pass

defregex

(self)

:"""

我們依次考察正規表示式中的每個字元,

當是非萬用字元時,我們就直接跟文字的字元進行匹配,如果相同,則繼續往下處理;如果不同,則回溯。

如果遇到特殊字元的時候,我們就有多種處理方式了,也就是所謂的岔路口,

比如「*」有多種匹配方案,可以匹配任意個文字串中的字元,我們就先隨意的選擇一種匹配方案,然後繼續考察剩下的字元。

如果中途發現無法繼續匹配下去了,我們就回到這個岔路口,重新選擇一種匹配方案,然後再繼續匹配剩下的字元。

"""self.rmatch(0,

0)return self.matched

defrmatch

(self, ti, pj)

:if self.matched:

# 如果已經匹配了,就不要繼續遞迴了

return

if pj == self.plen:

# 正規表示式到結尾了

if ti == self.tlen:

self.matched =

true

return

if self.pattern[pj]

=='*'

:# *匹配任意個字元

for k in

range

(self.tlen - ti)

: self.rmatch(ti + k, pj +1)

elif self.pattern[pj]

=='?'

:# ?匹配0個或者1個字元

self.rmatch(ti, pj +1)

self.rmatch(ti +

1, pj +1)

elif ti < self.tlen and self.pattern[pj]

== self.text[ti]

:# 純字元匹配才行

self.rmatch(ti +

1, pj +1)

defmain()

: p = regex(

'ab*a'

,'abbbbbbba'

)# 正例1

print

(p.regex())

p = regex(

'ab?a'

,'abba'

)# 正例2

print

(p.regex())

p = regex(

'ab*ab'

,'abbbbbbba'

)# 反例1

print

(p.regex())

p = regex(

'ab?a'

,'abbba'

)# 反例2

print

(p.regex())

pass

if __name__ ==

'__main__'

: main(

)

執行結果:

true

true

false

false

正規表示式篇

利用正規表示式來判斷輸入的字串格式是否正確 string regex 1 d 2 0 4 d 25 0 5 1 9 d 1 9 1 d 2 0 4 d 25 0 5 1 9 d d 1 d 2 0 4 d 25 0 5 1 9 d d 1 d 2 0 4 d 25 0 5 1 9 d d 判斷ip ...

正規表示式3

1 為萬用字元,表示任何乙個字元,例如 a.c 可以匹配 anc abc acc 2 在內可以指定要求匹配的字元,例如 a nbc c 可以匹配 anc abc acc 但不可以匹配 ancc a到z可以寫成 a z 0到9可以寫成 0 9 3 數量限定符號,表示匹配次數 或者叫做長度 的符號 包括...

正規表示式3

正規表示式用於字串處理 表單驗證等場合,實用高效。本文收集了一些常用的表示式 str preg replace a 1 2 3 str 其中用了三個子模式 每個圓括號中內容為乙個子模式 第乙個是鏈結開始標籤,第二個是鏈結文字,第三個是 然後第二個引數中 1 2 3就表示這三個部分,要替換成什麼樣子還...