1. 程式人生 > >失敗的嘗試 10. regular expression matching & 正則

失敗的嘗試 10. regular expression matching & 正則

循環 urn counter perf += 解釋 expected exp 感覺

Regular Expression Matching

看到正則就感覺頭大,因為正則用好了就很強大。有挑戰的才有意思。

其實沒有一點思路。循環的話,不能一一對比,匹配模式解釋的是之前的字符。那就先遍歷模式把。

... 中間 n 次失敗的提交

感覺代碼邏輯很亂。重新捋一下再動手寫。
找幾個重點分析一下:

Wrong Answer:

Input:
"aaa"
"ab*a*c*a"
Output:
false
Expected:
true

調試

aaa ab*a*c*a
0 a a s
1 a b n
1 a * * b
1 a a s
2 a * * a
prev char eq
False

分析,aaa

字符串s中s[1]的a被模式p[3]中的a匹配了,然後s[2]的a被p[4]的*匹配了。還是沒有解決*匹配0次的問題,那就得預先判斷後面是啥模式而不是在之後判斷前面的一個模式是啥。

N小時後來更,改了好多次沒有解決匹配0-多次字符之後還有該字符。
可能我鉆牛角尖了,刪掉重新想一種思路。

... 又 n 次失敗的本地測試
failed submission
import time

class Solution:
    def __init__(self):
        self.any=‘.‘ # any character
        self.zom=‘*‘ # zero or more
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        ci=0

        prevPattern=None

        for pi,pa in enumerate(p):
            if ci==len(s):
                if len(s)==0:
                    continue
                
                if ci>0 and prevPattern==self.zom:
                    ci-=1
                else:
                    break
                print("other:",pa)
                #continue
            while ci < len(s):
                ci+=1
                print(pi,pa,ci-1,s[ci-1],end="| ")
                if pa==self.any:
                    print(‘.‘)
                    break
                elif pa==self.zom:
                    print(‘*‘,prevPattern)
                    if prevPattern==self.any:
                        continue
                    elif prevPattern==s[ci-1]:
                        continue
                    else:
                        # no match, end processing 
                        pass
                        #prevPattern=‘‘
                        ci-=1
                        break
                    break
                elif pa==s[ci-1]:
                    # same character
                    print(‘s‘)
                    break
                else:
                    print(‘n‘)
                    ci-=1
                    break
            prevPattern=pa
        else:
            return ci==len(s)

        return False


if __name__ == "__main__":
    
    data = [
        {
            "input":{‘s‘:‘aa‘,‘p‘:‘a‘},
            "output":False, 
        },
        {
            "input":{‘s‘:‘aa‘,‘p‘:‘a*‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘ab‘,‘p‘:‘.*‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘aab‘,‘p‘:‘c*a*b‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘mississippi‘,‘p‘:‘mis*is*p*.‘},
            "output":False, 
        },
        {
            "input":{‘s‘:‘aaa‘,‘p‘:‘ab*a*c*a‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘ab‘,‘p‘:‘.*c‘},
            "output":False, 
        },
        {
            "input":{‘s‘:‘axb‘,‘p‘:‘a.b‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘mississippi‘,‘p‘:‘mis*is*ip*.‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘aaa‘,‘p‘:‘a*a‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘‘,‘p‘:‘.*‘},
            "output":True, 
        },
        {
            "input":{‘s‘:‘aaa‘,‘p‘:‘aaaa‘},
            "output":False, 
        },
        {
            "input":{‘s‘:‘a‘,‘p‘:‘ab*‘},
            "output":True, 
        }
    ];
    for d in data:
        
        print(d[‘input‘][‘s‘],d[‘input‘][‘p‘])
        
        # 計算運行時間
        start = time.perf_counter()
        result=Solution().isMatch(d[‘input‘][‘s‘],d[‘input‘][‘p‘])
        end = time.perf_counter()
        
        print(result)
        if result==d[‘output‘]:
            print("--- ok ---",end="\t")
        else:
            raise Exception
        
        print(start-end)

不行,今天大半天都浪費到這上面了,懷疑人生。

去搜索一下,發現:

  • 簡易正則表達式引擎的實現 裏面又推薦了:
  • 中國科學技術大學-編譯原理 我雲課堂裏收藏過這個啊
  • 輪子哥-《構造正則表達式引擎》新鮮出爐啦!

總結:想法本來就沒有成熟,之前的題目都是一些常規的,這個正則不研究沒有理論支撐可不好用。
等日後再戰

失敗的嘗試 10. regular expression matching & 正則