Python正则表达式核心语法与常用匹配字符详解
本文介绍了Python正则表达式的核心语法与应用场景。重点讲解了基础字符匹配(\d,\w等)、字符集([])、量词控制匹配次数、边界匹配(^,$)和分组(())等核心概念。通过手机号提取、数据脱敏等实战案例,展示了正则表达式在数据清洗、格式校验中的实际应用。文章还介绍了re模块常用函数(findall、sub等)及性能优化技巧(compile预编译)。这些知识可帮助数据服务商高效处理文本解析、接口
本文介绍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']
总结
- 核心字符:
\d(数字)、\w(单词)、.(任意字符)、[](字符集)是数据处理的高频基础; - 关键技巧:量词(
{n}/+/*)控制匹配次数,^/$定位文本边界,分组()实现复杂匹配 / 替换; - 性能优化:批量处理数据时,先用
re.compile()编译正则,提升执行效率。
这些语法覆盖了数据解析、文本清洗、接口数据校验等 90% 的日常场景,你可以结合自己的业务(如电商数据接口、数据清洗)尝试改写示例,快速落地使用。
更多推荐
所有评论(0)