关联标准POSIXPortable Operating System Interfacere是 Python 中的正则表达式库这是处理字符串匹配、查找、替换等操作的核心工具一、re 库核心概念Python 内置的正则表达式处理模块正则表达式Regex是一种字符串匹配的模式可以高效地实现字符串查找、匹配、替换字符串分割、提取特定内容数据校验如手机号、邮箱、身份证号基础元字符核心匹配规则元字符含义示例.匹配任意单个字符除换行符\na.c匹配abc、a1c、a#c^匹配字符串开头^abc匹配abc123不匹配123abc$匹配字符串结尾abc$匹配123abc不匹配abc123*匹配前一个字符 0 次或多次ab*c匹配ac、abc、abbbc匹配前一个字符 1 次或多次abc匹配abc、abbbc不匹配ac?匹配前一个字符 0 次或 1 次ab?c匹配ac、abc不匹配abbbc{n}匹配前一个字符恰好 n 次ab{2}c匹配abbc不匹配abc{n,}匹配前一个字符至少 n 次ab{2,}c匹配abbc、abbbc{n,m}匹配前一个字符 n 到 m 次ab{1,2}c匹配abc、abbc[]匹配括号内的任意一个字符a[0-9]c匹配a1c、a5c不匹配abc|或匹配多个模式中的一个abc|123匹配abc或123\转义字符匹配特殊字符本身a\.c匹配a.c不匹配abc\d匹配数字等价于[0-9]a\dc匹配a1c、a8c\w匹配字母 / 数字 / 下划线等价于[a-zA-Z0-9_]a\wc匹配abc、a5c、a_c\s匹配空白字符空格 / 制表符 / 换行等a\sc匹配a c、a\tc\D/\W/\S分别是\d/\w/\s的反向匹配\D匹配非数字二、re 库核心函数常用re.match ()从字符串开头匹配语法re.match(pattern, string, flags0)特点只匹配字符串开头匹配成功返回Match对象失败返回None常用方法group()获取匹配结果、span()获取匹配位置importre# 示例1匹配开头resultre.match(rabc,abc123)ifresult:print(匹配结果,result.group())# 输出abcprint(匹配位置,result.span())# 输出(0, 3)# 示例2不匹配开头返回Noneresult2re.match(rabc,123abc)print(result2)# 输出Nonere.fullmatch()判断整个字符串是否完全匹配正则规则语法re.fullmatch(pattern, string, flags0)特点判断整个字符串是否完全匹配正则规则区别于match()仅匹配开头importre# 验证是否是纯数字字符串完全匹配print(re.fullmatch(r\d,123))# re.Match object匹配print(re.fullmatch(r\d,123abc))# None不完全匹配re.search ()在字符串任意位置匹配第一个符合条件的结果语法re.search(pattern, string, flags0)特点扫描整个字符串返回第一个匹配结果无则返回Noneimportre# 示例匹配任意位置的第一个结果resultre.search(rabc,123abc456abc)ifresult:print(result.group())# 输出abcprint(result.span())# 输出(3, 6)re.findall ()查找字符串中所有符合条件的结果语法re.findall(pattern, string, flags0)特点返回所有匹配结果的列表无则返回空列表importre# 示例1提取所有数字resultre.findall(r\d,abc123def456ghi789)print(result)# 输出[123, 456, 789]# 示例2提取邮箱简单匹配result2re.findall(r\w\w\.\w,我的邮箱是test163.com备用邮箱是abcqq.com)print(result2)# 输出[test163.com, abcqq.com]re.finditer()查找字符串中所有匹配结果语法re.finditer(pattern, string, flags0)特点返回一个包含Match对象的迭代器而非列表核心优势节省内存尤其处理超长文本、能获取匹配位置信息span()/start()/end()importre text商品A99元商品B199元# 遍历迭代器获取匹配结果位置formatchinre.finditer(r\d,text):print(f匹配内容{match.group()}位置{match.span()}) 输出 匹配内容99位置(5, 7) 匹配内容199位置(13, 16) re.sub ()替换字符串中匹配的内容语法re.sub(pattern, repl, string, count0, flags0)参数repl替换后的字符串或函数count替换次数默认 0 表示全部替换特点返回替换后的新字符串importre# 示例1替换所有数字为*resultre.sub(r\d,*,手机号13812345678)print(result)# 输出手机号*# 示例2只替换前2个数字段result2re.sub(r\d,*,123abc456def789,count2)print(result2)# 输出*abc*def789# 示例3用函数替换将数字加1defadd_one(matched):numint(matched.group())returnstr(num1)result3re.sub(r\d,add_one,a1b2c3)print(result3)# 输出a2b3c4re.subn()替换字符串中匹配的内容语法re.subn(pattern, repl, string, count0, flags0)特点和re.sub()功能一致替换匹配内容但额外返回替换次数元组形式(替换后的字符串, 替换次数)importre# 替换数字为*并获取替换次数result,countre.subn(r\d,*,a1b22c333)print(替换结果,result)# 输出a*b*c*print(替换次数,count)# 输出3re.split ()按匹配的内容分割字符串语法re.split(pattern, string, maxsplit0, flags0)参数maxsplit最大分割次数默认 0 表示无限制特点返回分割后的列表importre# 示例1按任意数字分割resultre.split(r\d,a1b22c333d)print(result)# 输出[a, b, c, d]# 示例2最多分割2次result2re.split(r\d,a1b22c333d,maxsplit2)print(result2)# 输出[a, b, c333d]re.compile ()预编译正则表达式提升效率语法re.compile(pattern, flags0)适用场景多次使用同一正则表达式时预编译可减少重复解析提升性能importre# 预编译正则匹配手机号phone_patternre.compile(r1[3-9]\d{9})# 多次使用编译后的正则text1我的手机号13812345678text2他的手机号13987654321result1phone_pattern.search(text1)result2phone_pattern.search(text2)print(result1.group())# 输出13812345678print(result2.group())# 输出13987654321三、次要但实用的工具函数补充re.escape()作用自动转义正则中的特殊字符如.、*、?、\等避免手动转义出错适用场景匹配包含特殊字符的普通字符串如文件名、URLimportre# 要匹配的字符串包含特殊字符a.b*ctexttest a.b*c 123# 自动转义特殊字符patternre.escape(a.b*c)print(pattern)# 输出a\.b\*cprint(re.search(pattern,text).group())# 输出a.b*cre.purge()作用清空正则表达式的缓存Python 会缓存编译后的正则极少场景需要手动清空importre re.purge()# 清空正则缓存四、常用 flags匹配模式flags参数用于修改正则的匹配规则常用值标志含义re.I/re.IGNORECASE忽略大小写re.M/re.MULTILINE多行模式^/$匹配每行开头 / 结尾re.S/re.DOTALL让.匹配包括换行符在内的所有字符importre# 示例1忽略大小写resultre.search(rabc,ABC123,re.I)print(result.group())# 输出ABC# 示例2多行模式text line1: abc line2: 123 # 匹配每行开头的lineresult2re.findall(r^line,text,re.M)print(result2)# 输出[line, line]# 示例3让.匹配换行符result3re.search(ra.b,a\nb,re.S)print(result3.group())# 输出a\nb四、分组匹配提取特定部分用()表示分组可通过group(n)提取第 n 个分组的内容group(0)是整个匹配结果importre# 示例提取姓名和年龄text姓名张三年龄25姓名李四年龄30patternr姓名(.*?)年龄(\d)resultre.findall(pattern,text)print(result)# 输出[(张三, 25), (李四, 30)]# 示例分组命名更易读pattern2r姓名(?Pname.*?)年龄(?Page\d)result2re.search(pattern2,text)print(result2.group(name))# 输出张三print(result2.group(age))# 输出25总结核心定位re库是 Python 处理正则表达式的内置模块核心用于字符串的匹配、查找、替换、分割核心函数match()匹配字符串开头search()匹配任意位置第一个结果findall()获取所有匹配结果sub()替换匹配内容compile()预编译提升效率关键技巧用元字符构建匹配规则()实现分组提取多次使用同一正则时优先用compile()通过flags调整匹配模式如忽略大小写、多行匹配