编程与 AI12 分钟阅读更新于 2026-07-15

Python 怎么用正则提取文本信息:手机号、邮箱、链接和日期的实用写法

用真实文本处理场景讲清 Python re 模块如何提取手机号、邮箱、URL、日期和固定格式编号,并说明正则测试和误匹配处理方法。

相关工具

正则适合提取有规律的文本

正则表达式适合处理“格式有规律,但人工复制很麻烦”的内容。比如从一大段客服记录里提取手机号,从报名信息里提取邮箱,从日志里提取 URL,从文章里找日期,从文件名里提取编号。它不适合理解语义,也不适合判断一段话的真实含义。正则看的是字符模式。

Python 的 re 模块是标准库,不需要安装。常用方法有 re.findall、re.search、re.sub。findall 用来找出所有匹配结果,search 用来找第一个结果,sub 用来替换。新手最常用的是 findall,因为它能直接把匹配到的内容列出来。

写正则时不要一开始追求完美。先写一个能命中大部分样本的版本,再用实际文本测试误匹配和漏匹配。正则越复杂,越要先在小样本里验证,再放到批量脚本里跑。

提取手机号、邮箱和链接

提取中国大陆手机号,可以先用一个基础规则:

python代码示例
import re

text = '请联系 13800138000,备用邮箱 test@example.com'
phones = re.findall(r'1[3-9]\d{9}', text)
print(phones)

这个规则能匹配 1 开头、第二位 3 到 9、总共 11 位的数字。它不负责判断号码是否真实存在,只负责格式匹配。

提取邮箱可以用:

python代码示例
emails = re.findall(r'[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}', text)
print(emails)

邮箱规则非常复杂,真实业务里很难用一条正则覆盖所有合法情况。日常提取和清洗,用这个基础规则通常够用;如果是账号注册校验,还要结合更严格的后端规则。

提取 URL 可以写:

python代码示例
urls = re.findall(r'https?://[^\s,。]+', text)
print(urls)

这里匹配 http 或 https 开头,直到空白或中文标点前结束。不同文本来源的 URL 可能带括号、逗号或 Markdown 格式,提取后最好再清理末尾标点。

提取日期和编号要注意格式差异

日期格式经常不统一。有的写 2026-07-15,有的写 2026/7/15,有的写 2026年7月15日。可以分开写规则,也可以写一个稍微兼容的规则:

python代码示例
dates = re.findall(r'\d{4}[-/年]\d{1,2}[-/月]\d{1,2}日?', text)
print(dates)

这个规则能提取常见日期,但提取出来以后最好再用 datetime 解析,确认它是不是有效日期。比如 2026-99-99 从字符模式看可能匹配,但不是有效日期。正则负责找到候选,日期库负责判断有效性,这是更稳的分工。

编号提取通常要结合前缀。比如订单号是 ORD-20260715-001,可以写:

python代码示例
order_ids = re.findall(r'ORD-\d{8}-\d{3}', text)
print(order_ids)

如果只写一串数字,很容易误匹配手机号、日期或金额。能加业务前缀就加业务前缀,能限定长度就限定长度。

分组能让结果更好用

正则里的括号可以分组。比如你想从日志里提取日期和状态:

python代码示例
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 负责判断日期是否有效和统一格式。

Python 实用

继续阅读

返回专题