Python正则替换终极指南:用re.sub玩转字符串魔法
- 开源代码
- 2025-08-24 17:24:01

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 pile(r"\b\d{6}\b") # 匹配6位纯数字 text = "邮政编码:100001 200002" result = pattern.sub("[邮编]", text) print(result) # 邮政编码:[邮编] [邮编] 2. 处理多语言文本 中日韩字符过滤(2025年新增unicode扩展区支持) # 预编译正则表达式(工业级推荐) cjk_pattern = re pile( 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 pile( 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
Python正则替换终极指南:用re.sub玩转字符串魔法由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Python正则替换终极指南:用re.sub玩转字符串魔法”
下一篇
LLC谐振变换器原理