正規表示式匹配

2021-08-15 04:00:08 字數 1683 閱讀 4102

題目:

請實現乙個函式用來匹配包括'.'和'*'的正規表示式。模式中的字元'.'表示任意乙個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配。

解析:首先,考慮特殊情況:

1>兩個字串都為空,返回true

2>當第乙個字串不空,而第二個字串空了,返回false(因為這樣,就無法

匹配成功了,而如果第乙個字串空了,第二個字串非空,還是可能匹配成

功的,比如第二個字串是「a*a*a*a*」,由於『*』之前的元素可以出現0次,

所以有可能匹配成功)

之後就開始匹配第乙個字元,這裡有兩種可能:匹配成功或匹配失敗。但考慮到pattern

下乙個字元可能是『*』, 這裡我們分兩種情況討論:pattern下乙個字元為『*』或

不為『*』:

1>pattern下乙個字元不為『*』:這種情況比較簡單,直接匹配當前字元。如果

匹配成功,繼續匹配下乙個;如果匹配失敗,直接返回false。注意這裡的

「匹配成功」,除了兩個字元相同的情況外,還有一種情況,就是pattern的

當前字元為『.』,同時s的當前字元不為『\0』。

2>pattern下乙個字元為『*』時,稍微複雜一些,因為『*』可以代表0個或多個。

這裡把這些情況都考慮到:

a>當『*』匹配0個字元時,s當前字元不變,pattern當前字元後移兩位,

跳過這個『*』符號;

b>當『*』匹配1個或多個時,s當前字元移向下乙個,pattern當前字元

不變。(這裡匹配1個或多個可以看成一種情況,因為:當匹配乙個時,

由於s移到了下乙個字元,而pattern字元不變,就回到了上邊的情況a;

當匹配多於乙個字元時,相當於從s的下乙個字元繼續開始匹配)

**:

# -*- coding:utf-8 -*-

class solution:

# s, pattern都是字串

def match(self, s, pattern):

# write code here

pat = pattern

if len(s)==0 and len(pat)==0:

return true

if len(s)>0 and len(pat)==0:

return false

if len(pat)>1 and pat[1]=='*':

if len(s)>0 and (s[0]==pat[0] or pat[0]=='.'): # ab .* / ab a* 兩種情況統一處理

return self.match(s[1:], pat) or self.match(s, pat[2:]) or self.match(s[1:], pat[2:]) # *匹配1個保持當前模式/不匹配/移動到下乙個狀態

else: # len(s)==0 s匹配完,看剩下的是否匹配

return self.match(s, pat[2:])

if len(s)>0 and (pat[0]=='.' or pat[0]==s[0]): # 處理非匹配字元和 . 直接處理下乙個

return self.match(s[1:], pat[1:])

正規表示式 匹配

字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解法 首先要想到用遞迴處理...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 class solutio...