Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Regular Expression Matching ใน Python

กำหนดสตริง s และ pattern p รองรับ regex: '.' match ตัวอักษรเดียว, '*' match 0 หรือมากกว่าของตัวอักษรก่อนหน้า ต้องตรวจสอบว่า s match p หรือไม่

ตัวอย่าง: s="aa", p="a." → True; s="aaaaaa", p="a*" → True

ขั้นตอนการแก้ปัญหา (Dynamic Programming)

  • สร้างตาราง dp ขนาด (len(s)+1) x (len(p)+1)
  • dp[0][0] = True
  • เติม dp[0][j] สำหรับ pattern ที่มี '*' (dp[0][j] = dp[0][j-2] ถ้า p[j-1]=='*')
  • เติม dp[i][j]: ถ้า s[i-1]==p[j-1] หรือ p[j-1]=='.' → dp[i][j] = dp[i-1][j-1]; ถ้า p[j-1]=='*' → dp[i][j] = dp[i][j-2] หรือ (ถ้า s[i-1]==p[j-2] หรือ p[j-2]=='.') dp[i][j] = dp[i][j] or dp[i-1][j]

ตัวอย่างโค้ด

class Solution(object):
    def isMatch(self, s, p):
        ss = len(s)
        ps = len(p)
        dp = [[False for _ in range(ps+1)] for _ in range(ss+1)]
        p = " " + p
        s = " " + s
        dp[0][0] = True
        for i in range(2, ps+1):
            dp[0][i] = dp[0][i-2] if p[i] == '*' else False
        for i in range(1, ss+1):
            for j in range(1, ps+1):
                if s[i] == p[j] or p[j] == '.':
                    dp[i][j] = dp[i-1][j-1]
                elif p[j] == '*':
                    dp[i][j] = dp[i][j-2]
                    if s[i] == p[j-1] or p[j-1] == '.':
                        dp[i][j] = dp[i][j] or dp[i-1][j]
        return dp[ss][ps]

ob = Solution()
print(ob.isMatch("aa", "a."))
print(ob.isMatch("aaaaaa", "a*"))

อินพุต

"aa", "a." "aaaaaa", "a*"

เอาต์พุต

True True