Python正则表达式匹配

本文阅读 3 分钟
首页 Python笔记 正文
  1. '''
  2. 请实现一个函数用来匹配包括'.'和'*'的正则表达式。
  3. 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
  4. 在本题中,匹配是指字符串的所有字符匹配整个模式。
  5. 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
  6. '''
  7. # -*- coding:utf-8 -*-
  8. class Solution:
  9. # s, pattern都是字符串
  10. def match(self, s, pattern):
  11. if not s or not pattern:
  12. return False
  13. # 如果s和pattern匹配, 直接True
  14. if s == pattern:
  15. return True
  16. # 如果pattern为'', 因为s和pattern不相等, 直接False
  17. elif pattern == '':
  18. return False
  19. # 当s为'', 如果pattern为'.', 则返回True
  20. # 当s为'', 如果pattern长度为1且不为'.', 或者pattern第二个字符不是*, 则pattern不可能为空, 返回False
  21. # 若pattern长度不为1, 且第二个字符为*, pattern还有空的可能, 从第三个字符开始迭代
  22. elif s == '':
  23. if pattern == ".":
  24. return True
  25. elif len(pattern) == 1 or pattern[1] != '*':
  26. return False
  27. else:
  28. return self.match(s, pattern[2:])
  29. # 如果pattern长度不小于二, 而且pattern的第二个字符不是*的情况下
  30. # 当 pattern[0] 不等于s[0], 且不为 . 的时候, s和pattern必不相等
  31. # 否则, s 和 pattern 都右移一位, 继续比较
  32. if len(pattern) >= 2 and pattern[1] != '*':
  33. if s[0] != pattern[0] and pattern[0] != '.':
  34. return False
  35. else:
  36. return self.match(s[1:], pattern[1:])
  37. # 如果pattern长度不小于2, 且pattern第二个字符为*的情况下
  38. # 如果s[0]不等于pattern[0], 且pattern[0]不为 . , 那么第一位比较不成功, pattern必须后移两位继续比较后面是否能和s第一位匹配
  39. # 如果s[0]等于pattern[0], 或者pattern[0]为 . , 第一位匹配, 那么会有
  40. # 1. aaa 和 a*a 这种情况, 星号代表了多个a, 因此s需要不断右移一位继续比较
  41. # 2. a 和 a*a 中这情况, 这时候星号代表0个a, 因此s不需要右移, pattern需要右移两位
  42. # 3. abc 和 a*bc 这种情况, 星号代表了1个a, s右移一位, pattern右移两位继续比较
  43. elif len(pattern) >= 2 and pattern[1] == '*':
  44. if s[0] != pattern[0] and pattern[0] != '.':
  45. return self.match(s, pattern[2:])
  46. else:
  47. return self.match(s[1:], pattern) or self.match(s, pattern[2:]) or self.match(s[1:], pattern[2:])
  48. # 除去上述pattern不小于2情况, 只剩下pattern等于1的情况, 因此如果pattern为".", 而且s长度为1, 返回True
  49. elif pattern == '.' and len(s) == 1:
  50. return True
  51. return False
  52. s = Solution()
  53. print(s.match('aaa', 'a*a'))
解压密码: detechn或detechn.com

免责声明

本站所有资源出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。

本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户自行鉴别,做一个有主见和判断力的用户。

本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。

Python构建乘积数组
« 上一篇 01-21
Python表示数值的字符串
下一篇 » 01-21

发表评论