re.match()仅从字符串开头匹配,等价于正则前加^;re.search()才全局查找;验证整串格式应使用re.fullmatch();高频匹配需预编译re.compile();贪婪匹配应优先用.*?或否定字符集。

re.match() 和 re.search() 混用导致匹配失败
很多人默认 re.match() 就是“找字符串里有没有这个模式”,结果发现明明存在却返回 None。它只从字符串开头匹配,哪怕后面有完全符合的子串也无视。re.search() 才是真正“全局查找”。
- 用
re.match()时,等价于在正则前加了^锚定,比如re.match(r'abc', 'xabc')一定失败 - 想验证整个字符串是否符合某格式(如邮箱、日期),用
re.fullmatch()更准确,避免漏掉结尾校验 - 性能上,
match()在确定从头开始时略快,但误用带来的逻辑 bug 远比这点开销代价大
忘记 re.compile() 缓存,高频调用拖慢程序
在循环里反复写 re.search(r'd+', text),Python 每次都重新编译正则,开销明显。尤其当正则复杂或文本量大时,CPU 时间可能多花 2–5 倍。
- 把正则提成模块级变量:
PHONE_PATTERN = re.compile(r'1[3-9]d{9}'),后续直接调用PHONE_PATTERN.search(text) -
re.compile()返回的对象支持findall()、sub()、split()等全部方法,接口一致 - 如果正则带标志(如
re.I),必须在compile()时传入,不能在search()里再加——后者会被忽略
贪婪匹配没控制好,吃掉不该吃的字符
.* 看似方便,实际常导致跨段落、跨标签甚至整行吞掉。比如 re.search(r'<div>.*</div>', html),遇到嵌套 <div> 或多个 <code>


















