当前位置: 首页 > news >正文

Python正则替换终极指南:用re.sub玩转字符串魔法

Python正则替换终极指南:用re.sub玩转字符串魔法

一、为什么re.sub是文本处理的瑞士军刀?

在Python的re模块中,re.sub()的周下载量突破5800万次(2025年PyPI数据),它实现了:

  • 📍 模式匹配替换
  • 📍 动态内容生成
  • 📍 批量文本清洗
  • 📍 结构化数据转换

二、基础篇:5分钟掌握核心用法

1. 函数原型剖析

re.sub(pattern, repl, string, count=0, flags=0)
  • pattern:正则表达式模式(字符串或编译后的模式对象)
  • repl:替换内容(字符串或回调函数)
  • string:原始输入字符串
  • count:最大替换次数(0表示全部替换)
  • flags:匹配模式(如忽略大小写re.IGNORECASE

2. 基础替换示例

import re 
 
# 替换所有数字为*
text = "订单号:AB2025 金额:1500元"
result = re.sub(r"\d", "*", text)
print(result)  # 订单号:AB**** 金额:****元 
 
# 限制替换次数 
text = "1-2-3-4-5"
result = re.sub(r"-", ":", text, count=2)
print(result)  # 1:2:3-4-5 

以下案例均要添加 import re

三、进阶篇:解锁三大高阶技巧

1. 分组捕获与反向引用

\1 代表匹配的第1项,\2代表匹配的第2项,以此类推

# 重组日期格式(YYYY/MM/DD → DD-MM-YYYY)
text = "2025/02/20 → 2026/03/21"
result = re.sub(r"(\d{4})/(\d{2})/(\d{2})", r"\3-\2-\1", text)
print(result)  # 20-02-2025 → 21-03-2026 

# 给手机号加掩码 
text = "联系电话:13812345678"
result = re.sub(r"(\d{3})\d{4}(\d{4})", r"\1****\2", text)
print(result)  # 联系电话:138****5678 

2. 动态回调函数

# 数学表达式升级(数字扩大1000倍)
def multiply(match):
    num = float(match.group(1))
    return str(num * 1000)
 
text = "重量0.5kg 长度1.2m"
result = re.sub(r"(\d+\.?\d*)", multiply, text)
print(result)  # 重量500.0kg 长度1200.0m 

3. 命名分组与复杂替换

# 处理国际化日期格式
text = "Date: 02/20/2025 (MM/DD/YYYY)"
result = re.sub(
    r"(\d{2})/(\d{2})/(\d{4})",
    r"\3年\2月\1日",
    text
)
print(result)  # Date: 2025年02月20日 (MM/DD/YYYY)

四、工业级最佳实践

1. 性能优化方案

\b:匹配一个单词边界。

# 预编译正则模式(处理百万级文本时提速3倍)
pattern = re.compile(r"\b\d{6}\b")  # 匹配6位纯数字
text = "邮政编码:100001 200002"
result = pattern.sub("[邮编]", text)
print(result)  # 邮政编码:[邮编] [邮编]

2. 处理多语言文本

中日韩字符过滤(2025年新增unicode扩展区支持)
# 预编译正则表达式(工业级推荐)
cjk_pattern = re.compile(
    r"([\u4e00-\u9fff\u3400-\u4dbf]|"  # 中文
    r"[\u3040-\u309F\u30A0-\u30FF]|"  # 日文
    r"[\uAC00-\uD7A3\u1100-\u11FF])+",  # 韩文
    flags=re.UNICODE
)

text = "2025新版:漢字 かな 전자문서"
result = cjk_pattern.sub("[CJK]", text)
print(result)  # 输出:2025[CJK]:[CJK] [CJK] [CJK]

如果不过滤中文:

cjk_pattern = re.compile(
    r"([\u3040-\u309F\u30A0-\u30FF]|"  # 日文
    r"[\uAC00-\uD7A3\u1100-\u11FF])+",  # 韩文
    flags=re.UNICODE
)

text = "2025新版:漢字 かな 전자문서"
result = cjk_pattern.sub("[CJK]", text)
print(result)  # 2025新版:漢字 [CJK] [CJK]

3. 安全替换策略

# 防御正则注入攻击
def safe_sub(pattern, repl, text):
    escaped_pattern = re.escape(pattern)
    return re.sub(escaped_pattern, repl, text)


user_input = "恶意输入[a-z].*"
text = "重要数据:abc123"
result = safe_sub(user_input, "", text)  # 原样输出
print(result)  # 重要数据:abc123

五、三大实战应用场景

1. 数据清洗管道

def clean_log(text):
    rules = [
        (r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", "[IP]"),  # 隐藏IP 
        (r"\d{2}:\d{2}:\d{2}", "[TIME]"),               # 隐藏时间 
        (r"password=\w+", "password=")              # 脱敏密码 
    ]
    for pattern, repl in rules:
        text = re.sub(pattern, repl, text)
    return text 

2. 模板引擎开发

template = "欢迎{name}!您的订单{order_id}已发货"
context = {"name": "张三", "order_id": "20250220"}
 
def render(tpl, data):
    return re.sub(
        r"{(\w+)}",
        lambda m: str(data.get(m.group(1), "")), 
        tpl 
    )
 
print(render(template, context))  # 欢迎张三!您的订单20250220已发货 

3. Markdown转换器

def markdown_to_html(text):
    text = re.sub(r"### (.+)", r"\1", text)  # 三级标题 
    text = re.sub(r"!\[(.*?)\]\((.*?)\)", r'', text)
    return text 

相关文章:

  • 微信小程序消息推送解密
  • 【Cesium for Unreal】叠加/卸载GeoServer发布的多个shapefile
  • uniapp引入uview组件库(可以引用多个组件)
  • 网络运维学习笔记 015网工初级(HCIA-Datacom与CCNA-EI)NAT网络地址转换
  • 【零基础实战】STM32控制DRV8833电机驱动详解
  • 【YOLO11改进trick】Pinwheel-shaped Conv风车状卷积引入YOLO11,含创新点代码,方便发论文
  • 硬件学习笔记--46 电能表影响量试验梳理
  • LLC谐振变换器原理
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (1)
  • 力扣hot100——轮转数组
  • 搭建 Hadoop 3.3.6 伪分布式
  • Matplotlib中strpdate2num()函数报错的解决方法
  • 数字识别系统设计与实现
  • go~为什么会有json.Number这种类型存在
  • 大气体育直播模板赛事扁平自适应模板源码
  • 全面收集中间件Exporter适配:从Redis到ActiveMQ,掌握监控数据采集的最佳实践
  • Django加bootstrap实现上传文件含有进度条
  • 与本地电脑PDF文档对话的PDF问答程序
  • 设备唯一ID获取,支持安卓/iOS/鸿蒙Next(uni-device-id)UTS插件
  • 【ROS2】【ROS2】RViz2源码分析(八):Display中订阅ROS2消息(使用Qt信号和槽传递ROS2消息)
  • 陕西省建设厅证网站号多少/怎么给网站做优化
  • 郑州网站建设哪家有/seo具体是什么
  • 浙江常规网站建设/低价刷粉网站推广
  • 关于加强政府网站信息内容建设的实施意见/宁波seo公司排名
  • 80s网站建设工作室/博客网
  • 国外域名的网站怎么做/手机优化大师怎么退款