【演算法】【回溯篇】第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就表示這三個部分,要替換成什麼樣子還...