正則表達式的原理及實現(xiàn)

正則表達式:

正則表達式(regular expression)就是用一個“字符串”來描述一個特征咧栗,然后去驗證另一個“字符串”是否符合這個特征层宫。比如 表達式“ab+” 描述的特征是“一個 'a' 和 任意個 'b' ”座舍,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合這個特征。
常用的正則表達式符號如下表所示:

正則表達式.png

其中最常用的有如下幾個符號:
“ \ ”: 可以作為轉義字符孤澎,如我們平常編程時的轉義字符類似暇唾,主要時解決匹配特殊字符集,
“\w” : 匹配單詞字符
“ ^ ”: 表示取反剿骨。 如:[^\w] 表示非單詞字符代芜。但是要想匹配'^'符號,我們需要用轉義字符:[^]
"+","?","*": 分別表示匹配前一個字符 大于0次,大于等于0次,0次或1次
“{m}”: 表示匹配前面字符m次
“$”: 表示匹配末尾串
“[\u4e00-\u9fa5]?”: 匹配所有的漢子字符浓利,故[^\u4e00-\u9fa5]?:匹配所有非漢字字符挤庇,用于標點的剔除
其中考察我們編程實現(xiàn)的有四個符號: [. * ? +]。 主要寫出函數(shù):boolean isMatch(String a, String p);其中p為模式串贷掖,a為匹配串
思路1 :backtracking:
“*” 表示前面的字符出現(xiàn)>=0 次嫡秕,所以以*之前的點為回溯點。利用遞歸的思路程序如下:

class Solution(object):
    cache = {}
    def isMatch(self, s, p):
        if (s, p) in self.cache:
            return self.cache[(s, p)]
        if not p:
            return not s
        if p[-1] == '*':
            if self.isMatch(s, p[:-2]):
                self.cache[(s, p)] = True
                return True
            if s and (s[-1] == p[-2] or p[-2] == '.') and self.isMatch(s[:-1], p):
                self.cache[(s, p)] = True
                return True
        if s and (p[-1] == s[-1] or p[-1] == '.') and self.isMatch(s[:-1], p[:-1]):
            self.cache[(s, p)] = True
            return True
        self.cache[(s, p)] = False
        return False

思路2:DP
建立二維dp數(shù)組苹威;其中dp[i+1][j+1] 表示字符s[0.....i]與字符p[0...j]相互匹配昆咽;所以我們關注p[j + 1]的字符是否為‘*’作為我們討論的分類
p[j + 1] != '*': 只需要p[j + 1] == '.' || p[j + 1] == s[i + 1]時 dp[i+1][j = 1] =dp[i][j]
p[j + 1] == '*': 我們需要看前j個是否已經匹配了s[0...i]: 匹配了就讓*為不出現(xiàn)字符。否則看如果p[i] == '.' || p[i] == s[i] 則可以讓其等于一個前方字符

def isMatch(self, s, p):
    dp = [[False] * (len(s) + 1) for _ in range(len(p) + 1)]
    dp[0][0] = True
    for i in range(1, len(p)):
        dp[i + 1][0] = dp[i - 1][0] and p[i] == '*'
    for i in range(len(p)):
        for j in range(len(s)):
            if p[i] == '*':
                dp[i + 1][j + 1] = dp[i - 1][j + 1] or dp[i][j + 1]
                if p[i - 1] == s[j] or p[i - 1] == '.':
                    dp[i + 1][j + 1] |= dp[i + 1][j]
            else:
                dp[i + 1][j + 1] = dp[i][j] and (p[i] == s[j] or p[i] == '.')
    return dp[-1][-1]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末牙甫,一起剝皮案震驚了整個濱河市掷酗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窟哺,老刑警劉巖泻轰,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異且轨,居然都是意外死亡浮声,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門旋奢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泳挥,“玉大人,你說我怎么就攤上這事黄绩∠劢啵” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵爽丹,是天一觀的道長筑煮。 經常有香客問我辛蚊,道長,這世上最難降的妖魔是什么真仲? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任袋马,我火速辦了婚禮,結果婚禮上秸应,老公的妹妹穿的比我還像新娘虑凛。我一直安慰自己,他們只是感情好软啼,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布桑谍。 她就那樣靜靜地躺著,像睡著了一般祸挪。 火紅的嫁衣襯著肌膚如雪锣披。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天贿条,我揣著相機與錄音雹仿,去河邊找鬼。 笑死整以,一個胖子當著我的面吹牛胧辽,可吹牛的內容都是我干的。 我是一名探鬼主播公黑,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邑商,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帆调?” 一聲冷哼從身側響起奠骄,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤豆同,失蹤者是張志新(化名)和其女友劉穎番刊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體影锈,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡芹务,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸭廷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枣抱。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辆床,靈堂內的尸體忽然破棺而出佳晶,到底是詐尸還是另有隱情,我是刑警寧澤讼载,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布轿秧,位于F島的核電站中跌,受9級特大地震影響,放射性物質發(fā)生泄漏菇篡。R本人自食惡果不足惜漩符,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驱还。 院中可真熱鬧嗜暴,春花似錦、人聲如沸议蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咐容。三九已至狐赡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疟丙,已是汗流浹背颖侄。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留享郊,地道東北人览祖。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像炊琉,于是被迫代替她去往敵國和親展蒂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容

  • 個人學習批處理的初衷來源于實際工作苔咪;在某個迭代版本有個BS(安卓手游模擬器)大需求锰悼,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,717評論 0 11
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,743評論 0 33
  • 初衷:看了很多視頻团赏、文章箕般,最后卻通通忘記了,別人的知識依舊是別人的舔清,自己卻什么都沒獲得丝里。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,006評論 0 20
  • 一、什么是正則表達式 正則表達式体谒,又稱正規(guī)表示法杯聚,是對字符串操作的一種邏輯公式。正則表達式可以檢測給定的字符串是否...
    木馬不在轉閱讀 2,009評論 8 21
  • 1.語法特性 2. 控制語句 2.1. 判斷語句 2.2 循環(huán)語句 3. 數(shù)據(jù)結構 4.數(shù)據(jù)類型 4.1.基本數(shù)據(jù)...
    平安喜樂698閱讀 9,631評論 0 1