Python 怎么用正则提取文本信息:手机号、邮箱、链接和日期的实用写法
用真实文本处理场景讲清 Python re 模块如何提取手机号、邮箱、URL、日期和固定格式编号,并说明正则测试和误匹配处理方法。
相关工具
正则适合提取有规律的文本
正则表达式适合处理“格式有规律,但人工复制很麻烦”的内容。比如从一大段客服记录里提取手机号,从报名信息里提取邮箱,从日志里提取 URL,从文章里找日期,从文件名里提取编号。它不适合理解语义,也不适合判断一段话的真实含义。正则看的是字符模式。
Python 的 re 模块是标准库,不需要安装。常用方法有 re.findall、re.search、re.sub。findall 用来找出所有匹配结果,search 用来找第一个结果,sub 用来替换。新手最常用的是 findall,因为它能直接把匹配到的内容列出来。
写正则时不要一开始追求完美。先写一个能命中大部分样本的版本,再用实际文本测试误匹配和漏匹配。正则越复杂,越要先在小样本里验证,再放到批量脚本里跑。
提取手机号、邮箱和链接
提取中国大陆手机号,可以先用一个基础规则:
import re
text = '请联系 13800138000,备用邮箱 test@example.com'
phones = re.findall(r'1[3-9]\d{9}', text)
print(phones)这个规则能匹配 1 开头、第二位 3 到 9、总共 11 位的数字。它不负责判断号码是否真实存在,只负责格式匹配。
提取邮箱可以用:
emails = re.findall(r'[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}', text)
print(emails)邮箱规则非常复杂,真实业务里很难用一条正则覆盖所有合法情况。日常提取和清洗,用这个基础规则通常够用;如果是账号注册校验,还要结合更严格的后端规则。
提取 URL 可以写:
urls = re.findall(r'https?://[^\s,。]+', text)
print(urls)这里匹配 http 或 https 开头,直到空白或中文标点前结束。不同文本来源的 URL 可能带括号、逗号或 Markdown 格式,提取后最好再清理末尾标点。
提取日期和编号要注意格式差异
日期格式经常不统一。有的写 2026-07-15,有的写 2026/7/15,有的写 2026年7月15日。可以分开写规则,也可以写一个稍微兼容的规则:
dates = re.findall(r'\d{4}[-/年]\d{1,2}[-/月]\d{1,2}日?', text)
print(dates)这个规则能提取常见日期,但提取出来以后最好再用 datetime 解析,确认它是不是有效日期。比如 2026-99-99 从字符模式看可能匹配,但不是有效日期。正则负责找到候选,日期库负责判断有效性,这是更稳的分工。
编号提取通常要结合前缀。比如订单号是 ORD-20260715-001,可以写:
order_ids = re.findall(r'ORD-\d{8}-\d{3}', text)
print(order_ids)如果只写一串数字,很容易误匹配手机号、日期或金额。能加业务前缀就加业务前缀,能限定长度就限定长度。
分组能让结果更好用
正则里的括号可以分组。比如你想从日志里提取日期和状态:
line = '2026-07-15 INFO request success'
match = re.search(r'(\d{4}-\d{2}-\d{2})\s+(INFO|ERROR|WARN)', line)
if match:
print(match.group(1))
print(match.group(2))分组的好处是不用后续再切字符串。提取出来的每一部分都有明确含义。处理日志、文件名、接口返回文本时,分组非常实用。findall 遇到分组时会返回元组列表,适合直接转成表格或 CSV。
如果只想分组但不想捕获,可以用 `(?:...)`。新手一开始不用记太多高级写法,先把普通分组、findall、search、sub 用熟,就能解决大部分文本提取任务。
批量提取前先用工具测试样本
正则最怕误匹配。比如提取手机号时,身份证号里也可能包含类似 11 位数字;提取 URL 时,末尾中文句号可能被带进去;提取日期时,版本号可能被误认为日期。批量处理前,最好准备几段代表性样本,在正则测试工具里先验证命中结果。
脚本里也要保留检查输出。比如打印匹配数量、前 10 个结果、没有匹配的文件名。不要默默把结果导出后就结束。很多时候你会发现某类文件格式不一样,需要单独处理。
正则和 Python 很适合做第一轮自动提取,但重要数据仍然要抽样复核。尤其是手机号、邮箱、订单号这类后续要导入系统的数据,提取错一个字符就可能带来实际问题。稳一点,比炫技更重要。
常见问题
正则能判断手机号真实存在吗?
不能。正则只能判断格式是否像手机号,不能判断号码是否真实可用。
为什么我的正则匹配太多内容?
通常是规则写得太宽。可以增加前缀、长度、边界或排除标点,先用样本测试再批量处理。
提取日期后还需要 datetime 吗?
建议需要。正则负责提取候选日期,datetime 负责判断日期是否有效和统一格式。