
一、核心前提re 模块常用函数速查函数作用核心参数返回值场景re.match(pattern, string)从字符串开头匹配pattern正则表达式、string目标字符串匹配对象 / None前缀验证如手机号、邮箱前缀re.search(pattern, string)字符串任意位置匹配首次同上匹配对象 / None提取任意位置的目标内容re.findall(pattern, string)匹配所有符合规则的内容同上列表含所有匹配结果批量提取如所有链接、手机号re.finditer(pattern, string)迭代器形式返回所有匹配同上迭代器含匹配对象大量数据提取省内存re.sub(pattern, repl, string)替换匹配内容新增 repl替换字符串 / 函数替换后的字符串清洗数据如去除特殊字符re.compile(pattern)编译正则表达式pattern编译后的正则对象重复使用同一正则提效关键说明匹配对象常用方法group()获取匹配结果、groups()获取分组结果、span()获取匹配位置修饰符re.I忽略大小写、re.S. 匹配换行、re.M多行匹配可组合使用如re.I | re.S。二、正则语法核心片段语法说明示例匹配结果^字符串开头^1[3-9]匹配以 13-19 开头的字符串$字符串结尾[0-9]$匹配以数字结尾的字符串.匹配任意字符除换行a.b匹配 a 任意字符 b如 acb、aab*前面字符出现 0-∞ 次ab*匹配 a、ab、abb…前面字符出现 1-∞ 次ab匹配 ab、abb、abbb…?前面字符出现 0-1 次非贪婪ab?匹配 a、ab{n}前面字符出现 n 次a{3}匹配 aaa{n,m}前面字符出现 n-m 次a{2,4}匹配 aa、aaa、aaaa[]字符集匹配其中一个[a-zA-Z0-9]匹配字母 / 数字[^]反向字符集[^0-9]匹配非数字字符\d匹配数字等价 [0-9]\d{3}匹配 123、456…\D匹配非数字\D匹配 abc、中文…\w匹配字母 / 数字 / 下划线\w匹配 username123、test_abc\W匹配非字母 / 数字 / 下划线\W匹配 、#、空格…\s匹配空白字符空格 / 制表符 / 换行\s匹配多个空白\S匹配非空白字符\S匹配非空白内容()分组提取目标内容(\d{3})-(\d{4})分组 1 匹配前 3 位分组 2 匹配后 4 位或逻辑abc三、场景判断与提取所有场景均基于re模块直接复制可用标注「判断」「提取」明确用途。场景 1手机号判断与提取规则11 位数字以 13/14/15/17/18/19 开头importredefcheck_phone(phone):判断是否为有效手机号返回布尔值patternr^1[3-9]\d{9}$# ^$ 严格匹配整个字符串returnbool(re.match(pattern,phone))defextract_phones(text):从文本中提取所有手机号返回列表patternr1[3-9]\d{9}# 无需^$匹配任意位置returnre.findall(pattern,text)# 测试print(check_phone(13812345678))# Trueprint(extract_phones(联系电话13987654321备用15600001111))# [13987654321, 15600001111]场景 2邮箱判断与提取规则用户名 域名支持字母、数字、下划线、点号defcheck_email(email):判断是否为有效邮箱patternr^[a-zA-Z0-9_-][a-zA-Z0-9_-].[a-zA-Z]{2,6}$returnbool(re.match(pattern,email))defextract_emails(text):提取文本中所有邮箱patternr[a-zA-Z0-9_-][a-zA-Z0-9_-].[a-zA-Z]{2,6}returnre.findall(pattern,text)# 测试print(check_email(test123example.com))# Trueprint(extract_emails(邮箱user_nameqq.com工作邮箱work.123gmail.com))# [user_nameqq.com, work.123gmail.com]场景 3提取 URL 链接规则匹配 http/https 开头的链接defextract_urls(text):patternrhttps?://[^\s]# http或https开头直到空白字符结束returnre.findall(pattern,text)# 测试text推荐网站https://www.csdn.net文档https://docs.python.orgprint(extract_urls(text))# [https://www.csdn.net, https://docs.python.org]场景 4提取身份证号18 位规则17 位数字 最后 1 位数字 / X/xdefextract_id_cards(text):patternr\d{17}[\dXx]returnre.findall(pattern,text)# 测试text身份证110101199001011234备用22020219800202567Xprint(extract_id_cards(text))# [110101199001011234, 22020219800202567X]场景 5提取中文含短语defextract_chinese(text):patternr[\u4e00-\u9fa5]# 中文Unicode范围returnre.findall(pattern,text)# 测试textPython正则表达式提取中文你好世界123abcprint(extract_chinese(text))# [正则表达式提取中文, 你好, 世界]场景 6提取数字整数 小数defextract_numbers(text):patternr-?\d.?\d*# 支持负数、整数、小数returnre.findall(pattern,text)# 测试text价格99元折扣价89.9元亏损-10.5元print(extract_numbers(text))# [99, 89.9, -10.5]场景 7验证密码强度判断规则8-16 位含字母 数字 特殊字符#$%^*defcheck_password_strength(password):判断密码是否符合强密码规则# 三个条件同时满足长度8-16、含字母、含数字、含特殊字符patternr^(?.*[a-zA-Z])(?.*\d)(?.*[#$%^*])[a-zA-Z0-9#$%^*]{8,16}$returnbool(re.match(pattern,password))# 测试print(check_password_strength(Test123))# Trueprint(check_password_strength(weakpassword))# False无数字和特殊字符四、高级技巧分组提取与非贪婪匹配1. 分组提取例如提取「姓名张三年龄25」中的姓名和年龄text用户信息姓名张三年龄25性别男patternr姓名([^\u4e00-\u9fa5])年龄(\d)# 分组1匹配姓名分组2匹配年龄resultre.search(pattern,text)ifresult:nameresult.group(1)ageresult.group(2)print(f姓名{name}年龄{age})# 姓名张三年龄252. 非贪婪匹配问题.*默认贪婪匹配尽可能多的内容需用.*?非贪婪例如正则表达式a.*b在字符串 ‘a123b456b’ 中.*会一口气吃掉从第一个 a 之后到最后一个 b 之前的所有字符最终匹配的是 ‘a123b456b’ 整个子串而不是我们可能期望的 ‘a123b’。非贪婪匹配在量词后面加上 ?量词会尽可能少地重复匹配只要能让整个表达式匹配成功。正则表达式改为a.*?b得到 ‘a123b’。贪婪写法非贪婪写法说明**?零次或多次尽可能少?一次或多次尽可能少???零次或一次倾向于零次{m,n}{m,n}?至少 m 次至多 n 次尽可能少# 提取 HTML 标签内容htmldiv第一段/divdiv第二段/div# 贪婪匹配.* 会匹配到最后一个 /divgreedy_tagsre.findall(rdiv(.*)/div,html)print(贪婪匹配提取内容,greedy_tags)# 输出: [第一段/divdiv第二段]# 非贪婪匹配.*? 只匹配到最近的 /divnon_greedy_tagsre.findall(rdiv(.*?)/div,html)print(非贪婪匹配提取内容,non_greedy_tags)# 输出: [第一段, 第二段]在正则表达式中? 有两种用法作为普通量词表示“零次或一次”贪婪。跟在其他量词后面表示将贪婪变为非贪婪懒惰。例如.*? 表示“任意字符重复零次或多次但尽可能少”。.? 表示“任意字符重复一次或多次但尽可能少”。a?? 表示“匹配一个 a 或零个 a但优先零个”。# ?? 示例匹配两个字符但尽可能少print(re.findall(ra??,aa))# 输出: [, a, ] 因为第一个位置优先匹配0个a五、常见问题与避坑指南匹配不到换行符问题.默认不匹配换行需加修饰符re.S示例re.search(ra.b, a\nb, re.S)→ 匹配成功忽略大小写匹配加修饰符re.I示例re.match(rabc, ABC, re.I)→ 匹配成功正则中有特殊字符如 . * ?需转义加\或用re.escape()自动转义示例匹配www.baidu.com→pattern rwww\.baidu\.com或pattern re.escape(www.baidu.com)重复使用同一正则用re.compile()编译提升效率示例patternre.compile(r1[3-9]\d{9})print(pattern.match(13812345678))# 直接使用编译后的对象print(pattern.findall(联系电话13987654321))六、常用需求正则表达式Python 代码片段判断手机号^1[3-9]\d{9}$re.match(r^1[3-9]\d{9}$, phone)判断邮箱^[a-zA-Z0-9_-][a-zA-Z0-9_-].[a-zA-Z]{2,6}$re.match(r^[a-zA-Z0-9_-][a-zA-Z0-9_-].[a-zA-Z]{2,6}$, email)提取手机号1[3-9]\d{9}re.findall(r1[3-9]\d{9}, text)提取邮箱[a-zA-Z0-9_-][a-zA-Z0-9_-].[a-zA-Z]{2,6}re.findall(r[a-zA-Z0-9_-][a-zA-Z0-9_-].[a-zA-Z]{2,6}, text)提取中文[\u4e00-\u9fa5]re.findall(r[\u4e00-\u9fa5], text)提取数字含小数-?\d.?\d*re.findall(r-?\d.?\d*, text)提取 URLhttps?://[^\s]re.findall(rhttps?://[^\s], text)