Python正则匹配靠re模块,核心是写对pattern并选对方法;match从开头匹配,search全局扫描;需注意^$锁首尾、\b防误匹配、判空再group、分组提取、预编译提效、标志控制行为、转义特殊字符。

Python正则匹配靠 re 模块,核心是写对模式(pattern),再选对方法(match、search、findall 等),不难但细节决定成败。
基础匹配:用好 match 和 search
re.match() 只从字符串开头匹配,哪怕后面有符合的也不管;re.search() 扫描整个字符串,找到第一个就停。别混淆它们的定位逻辑。
- 验证手机号开头是 13–19:用
re.match(r'^1[3-9]\d{9}$', text)——^和$锁死首尾才叫“完整匹配” - 从日志里找 IP 地址:用
re.search(r'\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b', log_line),\b防止匹配到 192.168.1.1000 中的前段 - 匹配失败返回
None,务必先判空再调.group(),否则报AttributeError
提取内容:group 和 findall 是主力
带括号的子模式会捕获分组,.group(1) 就取第一个括号里的内容;findall 更省事——有分组就只返回分组内容,没分组才返回全部匹配串。
- 提取邮箱用户名:
re.search(r'(\w+)@(\w+\.\w+)', 'contact@py.org').group(1)→'contact' - 批量取所有邮箱:
re.findall(r'\b\w+@\w+\.\w+\b', text)直接得列表,不用循环 - 想同时拿到用户名和域名?用
re.findall(r'(\w+)@(\w+\.\w+)', text),返回[('user', 'domain.com'), ...]
进阶技巧:编译、标志和非贪婪
频繁使用的正则建议用 re.compile() 预编译,提升性能;re.I 忽略大小写,re.S 让 . 匹配换行符;默认是贪婪匹配,加 ? 变成非贪婪,比如 r'a.*?b' 匹配最短的 a…b。
立即学习“Python免费学习笔记(深入)”;
- 处理多行 HTML 片段:加
re.S,re.search(r'才能跨行抓内容(.*?)', html, re.S) - 忽略大小写搜关键词:
re.findall(r'python', text, re.I) - 预编译后复用:
phone_pat = re.compile(r'1[3-9]\d{9}');phone_pat.search(text)
安全与调试:避免常见坑
特殊字符如 .、*、+、?、^、$、\、|、(、)、[、] 在模式里有含义,字面意思要加反斜杠转义;不确定时用 re.escape() 自动转义字符串。
- 搜索含
.的版本号如2.15.3:写r'2\.15\.3',不是'2.15.3'(那个点会匹配任意字符) - 拼接用户输入的关键词?先
re.escape(user_input)再放进 pattern,防注入式正则攻击 - 调试时用
re.DEBUG标志,比如re.compile(r'\d+', re.DEBUG),能打印出解析树,看清引擎怎么理解你的模式










