前言
在文本处理场景中,我们经常需要从一堆杂乱字符串中提取手机号、邮箱、网址,或者清洗文本里多余空格、特殊符号。普通字符串 find、replace 方法面对复杂规则很难实现,正则表达式就是专门用来描述文本匹配规则的工具。Python 内置 re 模块,无需额外安装。很多初学者觉得正则晦涩难懂,其实掌握常用元字符和 re 模块几个核心函数,就可以处理 80% 以上的文本提取需求。本文从基础语法到实战案例,带大家吃透 Python 正则。
一、正则基础元字符介绍
简单介绍高频正则符号:.匹配任意单个字符(换行除外);*匹配前面字符 0 次或者多次;+匹配前面字符 1 次或者多次;?匹配前面字符 0 次或者 1 次;\d数字 0-9;\w字母数字下划线;\s空白字符;[]字符集合;()分组提取内容;^字符串开头;$字符串结尾。
注意:Python 字符串里反斜杠需要转义,写正则推荐使用原始字符串 r"",避免转义冲突。
二、re 模块核心函数
- re.search:扫描整个字符串,找到第一个匹配结果;
- re.match:只从字符串开头匹配;
- re.findall:查找全部匹配内容,返回列表,最常用;
- re.sub:替换匹配到的字符串,文本清洗首选;
- re.compile:预编译正则表达式,多次复用的时候提升性能。
基础示例:提取文本里面手机号,国内手机号 11 位数字。
import re text = "联系电话:13800138000,备用号码13900139000,无效号码123456" pattern = r'1[3-9]\d{9}' result = re.findall(pattern, text) print(result)运行结果返回所有匹配到手机号列表。1[3-9]代表第一位是 1,第二位 3 到 9,后面跟 9 位数字。
三、实战案例 1:提取邮箱地址
邮箱规则:用户名 @域名,用户名可以字母数字下划线,域名包含点。
email_text = "联系方式:test@163.com,demo@qq.com,wrong@.com" email_pattern = r'[a-zA-Z0-9_-]+@[a-zA-Z0-9]+\.[a-zA-Z]+' email_list = re.findall(email_pattern, email_text) print(email_list)使用 findall 可以一次性提取全部邮箱。如果只想提取用户名部分,可以使用分组 ():
pattern_group = r'([a-zA-Z0-9_-]+)@[a-zA-Z0-9]+\.[a-zA-Z]+' res = re.findall(pattern_group, email_text)括号内的内容,会单独提取出来。
四、实战案例 2:文本清洗,去除多余空白、特殊符号
爬虫获取的网页文本经常夹杂大量换行符、多余空格、特殊符号,使用 re.sub 做替换清洗。
raw_text = "Python 正则\n教程,#¥%,测试 文本!!" # 多个空白替换成单个空格 clean_text = re.sub(r'\s+', " ", raw_text) # 移除中文标点外特殊符号 clean_text = re.sub(r'[#¥%]', "", clean_text) print(clean_text)re.sub 的参数:正则表达式,替换内容,原始字符串。适合文本预处理、数据清洗场景。
五、预编译 re.compile,提升循环匹配性能
如果一段正则需要循环匹配上千条文本,每次 re.findall 都会重复编译正则,性能较差。使用 compile 预编译一次,重复使用。
phone_pattern = re.compile(r'1[3-9]\d{9}') text_list = ["电话13800138000","号码13511112222"] for t in text_list: print(phone_pattern.findall(t))六、正则修饰符
re.I 忽略大小写;re.S 让.匹配换行符;re.M 多行模式。 比如带换行的网页文本,开启 re.S,.可以跨多行匹配内容。
html = """标题:Python教程 作者:CSDN """ res = re.search(r"标题:(.*?)作者", html, re.S) print(res.group(1))非贪婪匹配.*?是高频知识点:.*贪婪匹配尽可能多字符,.*?尽可能少匹配,爬虫提取标签内容基本都用非贪婪模式。
七、正则避坑提醒
- 贪婪匹配陷阱:忘记加?,导致匹配范围超出预期;
- 转义问题:正则一定要用 r 原始字符串;
- 不要滥用正则解析 HTML:复杂网页解析优先 BeautifulSoup,正则只适合简单文本;
- 正则不是万能:复杂嵌套结构(括号嵌套)正则很难处理。
八、结语
正则表达式是文本处理利器,数据清洗、日志解析、简单文本抓取都会用到。不需要死记所有正则语法,记住常用元字符,遇到需求先写简单规则,逐步调试。调试正则可以在线正则测试网站实时验证表达式。学习正则最好的方式就是多写多测试。在数据处理工作中,re 模块配合 pandas,能够快速完成文本类数据清洗。后续会继续分享 pandas 数据清洗实战案例,欢迎关注。