写爬虫时想抓出网页里的电话号码,却卡在一堆乱七八糟的字符里?处理用户输入时,想确认是不是合法邮箱,又不想写一长串 if 判断?这时候,Python 的 re 模块就是你的快刀——正则表达式,看似神秘,其实摸清几条常用规则,日常够用大半。
先跑通一个最简单的例子
比如你有一段文本:"联系我: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 开头,第二位是 3 到 9 中任意一个数字,后面再跟 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()]) # ['你好', '今天怎么样', '我还不错']
正则不是越复杂越好,能解决手头问题的,就是好正则。多对着真实数据试两遍,比背十页语法表管用。