You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:40:17