码迷,mamicode.com
首页 > 其他好文 > 详细

失败的尝试 10. regular expression matching & 正则

时间:2018-07-25 18:18:15      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:break   重点   sipp   想法   https   roc   return   raise   course   

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 & 正则

标签:break   重点   sipp   想法   https   roc   return   raise   course   

原文地址:https://www.cnblogs.com/warcraft/p/9367415.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!