Python正则表达式用法:从匹配手机号到提取邮箱,一篇讲清楚

写爬虫时想抓出网页里的电话号码,却卡在一堆乱七八糟的字符里?处理用户输入时,想确认是不是合法邮箱,又不想写一长串 if 判断?这时候,Pythonre 模块就是你的快刀——正则表达式,看似神秘,其实摸清几条常用规则,日常够用大半。

先跑通一个最简单的例子

比如你有一段文本:"联系我:13812345678,邮箱是user@example.com",想把手机号拎出来:

import re

text = "联系我:13812345678,邮箱是user@example.com"
phone = re.search(r"1[3-9]\d{9}", text)
if phone:
    print(phone.group())  # 输出:13812345678

这里 r"1[3-9]\d{9}" 就是正则模式:1 开头,第二位是 39 中任意一个数字,后面再跟 9 个数字——刚好 11 位大陆手机号。

几个高频符号,记住就能上手

\d 表示任意数字(等价于 [0-9]);\w 匹配字母、数字或下划线;. 匹配除换行符外的任意单个字符;* 表示前面的字符可出现 0 次或多次;+ 表示至少 1 次;? 表示最多 1 次(即有或没有)。

提取邮箱,试试这个模式

邮箱格式千奇百怪,但常见结构是「用户名@域名.后缀」。一个实用的简化版正则:

email_pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
emails = re.findall(email_pattern, text)
print(emails)  # ['user@example.com']

注意 \. 中的反斜杠——因为点号 . 在正则里是特殊字符,要匹配真正的英文句点,必须转义。

替换和分割也很常用

想把一段文字里所有连续空格换成单个空格:

text = "今天   天气   很好"
cleaned = re.sub(r"\s+", " ", text).strip()
print(cleaned)  # "今天 天气 很好"

或者按中文标点切分句子:

sentence = "你好!今天怎么样?我还不错。"
parts = re.split(r"[!?。]+", sentence)
print([p for p in parts if p.strip()])  # ['你好', '今天怎么样', '我还不错']

正则不是越复杂越好,能解决手头问题的,就是好正则。多对着真实数据试两遍,比背十页语法表管用。