本文介绍Python 正则表达式的核心语法,以及常用匹配字符的含义和用法 —— 这是数据解析、文本清洗、接口数据校验等场景的核心技能,尤其贴合你作为数据服务商的日常工作需求。下面我会从基础字符进阶语法,结合实战示例详解,让你既能理解原理,又能直接落地使用。


一、正则表达式核心基础

正则表达式(Regex)是处理文本的 “模式匹配工具”,Python 中通过内置的re模块实现。核心逻辑是:用模式字符串描述要匹配的文本规则,再用re模块函数去校验 / 提取 / 替换目标文本。

1. 最基础:匹配字符(原子)

这是正则的最小单位,分为普通字符特殊元字符两类:

类型 符号 / 示例 含义 实战示例(re.findall结果)
普通字符 a/123/_ 匹配字符本身(区分大小写) re.findall(r"python", "Python python")['python']
任意字符 . 匹配除换行符\n外的任意单个字符 re.findall(r"p.th", "python p0th p\nh")['pyth','p0th']
数字匹配 \d/\D \d= 匹配 0-9 数字;\D= 匹配非数字(取反) re.findall(r"\d", "订单123金额45.6")['1','2','3','4','5','6']
单词匹配 \w/\W \w= 匹配字母 / 数字 / 下划线;\W= 匹配非字母 / 数字 / 下划线 re.findall(r"\w", "user_888@csdn")['u','s','e','r','_','8','8','8','c','s','d','n']
空白匹配 \s/\S \s= 匹配空格 / 制表符\t/ 换行符\n\S= 匹配非空白 re.findall(r"\s", "a b\tc\nd")[' ','\t','\n']

2. 核心:字符集([])

匹配括号内任意一个字符,是数据筛选的高频用法:

  • [abc]:匹配 a、b、c 中的任意一个
  • [a-z]:匹配小写字母 a 到 z(范围匹配)
  • [A-Z0-9]:匹配大写字母或数字
  • [^abc]:匹配除 a、b、c 外的任意字符(^在 [] 内表示取反)

示例(提取手机号前缀)

python

import re
text = "13800138000 15912345678 12099998888"
# 匹配以13/15开头的手机号前2位
res = re.findall(r"1[35]\d{9}", text)
print(res)  # 输出:['13800138000', '15912345678']

3. 关键:量词(控制匹配次数)

用于指定 “前面的字符 / 模式要匹配多少次”,分贪婪匹配(默认,尽可能多匹配)和非贪婪匹配(加?,尽可能少匹配):

量词 含义 贪婪示例 非贪婪示例(加?)
* 0 次或多次 r"a*"匹配 "aaaa"→aaaa r"a*?"匹配 "aaaa"→''
+ 1 次或多次 r"a+"匹配 "aaaa"→aaaa r"a+?"匹配 "aaaa"→a
? 0 次或 1 次 r"a?"匹配 "aaaa"→a r"a??"匹配 "aaaa"→''
{n} 恰好 n 次 r"\d{3}"匹配 "1234"→123 -
{n,} 至少 n 次 r"\d{2,}"匹配 "1234"→1234 r"\d{2,}?"12
{n,m} n 到 m 次(包含 n 和 m) r"\d{2,4}"匹配 "12345"→1234 r"\d{2,4}?"12

示例(数据脱敏)

python

# 手机号脱敏:保留前3后4,中间替换为****
phone = "13800138000"
res = re.sub(r"1(\d{2})\d{4}(\d{4})", r"1\1****\2", phone)
print(res)  # 输出:138****8000

4. 进阶:边界匹配与分组

(1)边界匹配(定位文本位置)
符号 含义 示例(匹配整行手机号)
^ 匹配字符串开头 r"^1\d{10}":匹配以 1 开头的 11 位手机号(整行)
$ 匹配字符串结尾 r"1\d{10}$":匹配以 11 位手机号结尾的文本
\b 匹配单词边界(空格 / 标点分隔) r"\bpython\b":匹配独立的 "python",不匹配 "pythonic"
(2)分组(())

将括号内的内容视为一个整体,支持分组引用选择匹配

  • (ab)+:匹配 "ab" 重复 1 次或多次(比如 "abab")
  • a|b:匹配 a 或 b(选择)
  • \数字:引用第 n 个分组(比如\1引用第一个分组)

示例(提取日期)

python

text = "2026-01-13 2026/01/14 20260115"
# 匹配yyyy-mm-dd格式的日期(分组提取年/月/日)
pattern = r"(\d{4})-(\d{2})-(\d{2})"
res = re.findall(pattern, text)
print(res)  # 输出:[('2026', '01', '13')]

# 替换日期格式:yyyy-mm-dd → yyyymmdd
new_text = re.sub(pattern, r"\1\2\3", text)
print(new_text)  # 输出:20260113 2026/01/14 20260115

二、Python re 模块常用函数(实战核心)

正则的语法最终要通过re模块函数落地,以下是数据服务场景的高频函数:

函数 作用 适用场景
re.findall() 返回所有匹配结果的列表 批量提取数据(如提取所有数字 / 手机号)
re.search() 扫描文本,返回第一个匹配的 Match 对象(无则 None) 校验文本是否包含目标模式
re.match() 仅从文本开头匹配,返回 Match 对象(无则 None) 校验整串文本(如手机号 / 邮箱格式)
re.sub() 替换匹配的内容(支持分组引用) 数据脱敏 / 格式统一
re.compile() 编译正则表达式,提升多次匹配的效率 批量处理大量数据(如解析 10 万条文本)

示例(编译正则提升效率)

python

# 编译正则(只需编译1次,重复使用)
pattern = re.compile(r"\b\d{4}-\d{2}-\d{2}\b")  # 匹配yyyy-mm-dd日期

# 批量处理10万条文本时,编译后效率提升50%+
texts = ["2026-01-13 订单1", "2026/01/14 订单2", "2026-01-15 订单3"]
for text in texts:
    dates = pattern.findall(text)
    print(f"匹配到的日期:{dates}")

三、实战案例(贴合数据服务场景)

案例 1:校验身份证号格式(18 位,最后一位可为 X)

python

pattern = r"^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$"
id_card = "110101199001011234"
if re.match(pattern, id_card):
    print("身份证号格式合法")
else:
    print("格式非法")

案例 2:提取接口返回的 JSON 中的数值

python

response = '{"code":200,"data":{"order_count":100,"total_amount":29999.5}}'
# 提取所有数字(含小数)
nums = re.findall(r"\d+\.?\d*", response)
print(nums)  # 输出:['200', '100', '29999.5']

总结

  1. 核心字符\d(数字)、\w(单词)、.(任意字符)、[](字符集)是数据处理的高频基础;
  2. 关键技巧:量词({n}/+/*)控制匹配次数,^/$定位文本边界,分组()实现复杂匹配 / 替换;
  3. 性能优化:批量处理数据时,先用re.compile()编译正则,提升执行效率。

这些语法覆盖了数据解析、文本清洗、接口数据校验等 90% 的日常场景,你可以结合自己的业务(如电商数据接口、数据清洗)尝试改写示例,快速落地使用。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐