如何用Python正则表达式对同一匹配模式执行多值替换?
Python正则实现多次不同值的替换
原始需求场景
已知可以用re.sub指定count参数完成单次替换:
import re first = "33,33" second = '22,55' # 单次替换第一个匹配项 result = re.sub(r"\d+\,\d+", first, "There are 2,30 foo and 4,56 faa", count=1) print(result) # 输出: 'There are 33,33 foo and 4,56 faa'
需要实现按顺序用不同值替换匹配到的多个目标,最终得到:
'There are 33,33 foo and 22,55 faa'
解决方案
方法1:利用迭代器+替换函数
re.sub的第二个参数支持传入函数,每次匹配时会调用该函数并返回替换值。我们可以把替换值列表转为迭代器,每次匹配取一个值:
import re first = "33,33" second = '22,55' # 将替换值转为迭代器 replace_iter = iter([first, second]) # 用lambda函数每次取迭代器的下一个值 result = re.sub(r"\d+\,\d+", lambda _: next(replace_iter), "There are 2,30 foo and 4,56 faa") print(result) # 输出目标结果
如果匹配项数量多于替换值数量,想要避免StopIteration异常,可以给next()加默认值:
lambda _: next(replace_iter, "默认替换值")
方法2:手动遍历匹配项替换
先找到所有匹配位置,从后往前替换(避免替换后位置偏移):
import re first = "33,33" second = '22,55' replacements = [first, second] text = "There are 2,30 foo and 4,56 faa" # 获取所有匹配对象 matches = list(re.finditer(r"\d+\,\d+", text)) # 从后往前替换,防止位置偏移 result = text for match, rep in zip(reversed(matches), reversed(replacements)): result = result[:match.start()] + rep + result[match.end():] print(result) # 输出目标结果
这种方式可以灵活控制替换的数量,若匹配项多于替换值,只会替换前N个(N为替换列表长度),剩余匹配项保持原样。
内容的提问来源于stack exchange,提问作者franco mango
相关产品推荐
相关产品推荐

