str.replace()适用于固定子串的简单替换,速度快且安全;re.sub()适用于基于模式的复杂替换,支持正则表达式匹配、捕获组和条件替换,但需注意转义和性能问题。
Python里做文本替换,str.replace() 和 re.sub() 是最常用的两个工具,但它们适用场景完全不同。选错方法不仅写起来费劲,还容易出错或漏替换。
str.replace( 是纯字符串逐字匹配,不涉及模式、不区分大小写(除非手动处理)、也不支持通配。它快、安全、直观,适合明确知道要换什么、换几次的场景。
old, new)
"apple" 换成 "orange"
replace(old, new, count=2)
replace 不管这个"aaa".replace("aa", "b") 结果是 "ba",不是 "b"(因为只找一次“aa”,从左到右匹配后跳过已处理位置)re.sub(pattern, repl, string) 基于规则匹配,能处理模糊、结构化、带条件的文本。但正则写错一个符号,结果可能完全不对。
re.sub(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", "[EMAIL]", text)
"year: 2025" 改成 "年份:2025",可用 re.sub(r"year:\s*(\d{4})", r"年份:\1", text)
re.sub("hello", "hi", text, flags=re.I)
replace 低,尤其简单任务硬套正则,反而拖慢代码两者混用或误用,容易踩坑。
replace 对特殊字符无感,但正则中 .、*、+ 等有含义——要替换字面量 "a.b",正则得写成 r"a\.b" 或用 re.escape("a.b")
replace 不支持“只在单词边界替换”,比如只想换独立的 "cat",不碰 "scatter"——必须用 re.sub(r"\bcat\b", ...)
replace 要链式调用(易读但略啰嗦),正则可用函数作为 repl 参数统一处理\w 不匹配汉字,要用 [\u4e00-\u9fff] 或开启 re.U 标志拿到一段替换需求,先问自己三个问题:
replace 优先flags 或预处理不复杂但容易忽略。