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

如何使用Python替换字符串中交替出现的指定子串?

需求说明

需要将字符串中指定子串的奇数序位出现(第1、3、5…次)替换为新子串,例如示例中要把xx的第1、3次出现替换为rr。

原实现代码如下:

#------------------------------------------------------ 
import re
str1="abcxxhghxxjjhxxjjhj"
cnt=0
for i in re.finditer("xx",str1):
    cnt=cnt+1    
    if cnt%2!=0:
        print(cnt)
        l=i.span()[0]
        m=i.span()[1]
        print(l,m)
        str1=re.sub(str1[l:m],"rr",str1)
    
print(str1)

预期输出:abcrrhghxxjjhrrjjhj

原代码问题分析

原逻辑存在两个核心错误,导致无法得到预期结果:

  • re.finditer返回的所有匹配位置是基于未修改的原始字符串计算的,每次修改str1后字符串长度发生变化,后续匹配拿到的span索引会全部错位
  • 直接调用re.sub(str1[l:m],"rr",str1)会全局替换所有匹配的对应子串,无法做到仅替换当前定位到的单个匹配项
正确实现方案

推荐使用re.sub的回调函数功能实现,逻辑更简洁也不会出现索引错位问题:

import re

str1 = "abcxxhghxxjjhxxjjhj"
cnt = 0

def replace_odd(match):
    global cnt
    cnt += 1
    # 奇数序位返回替换后的新子串,偶数序位返回原匹配内容
    return "rr" if cnt % 2 != 0 else match.group()

result = re.sub("xx", replace_odd, str1)
print(result)

如果不想使用全局变量,也可以用闭包封装计数器,避免全局污染:

import re

def odd_replacer(new_str):
    cnt = 0
    def inner(match):
        nonlocal cnt
        cnt += 1
        return new_str if cnt %2 !=0 else match.group()
    return inner

str1 = "abcxxhghxxjjhxxjjhj"
result = re.sub("xx", odd_replacer("rr"), str1)
print(result)
输出结果

两种实现的运行结果均符合预期:
abcrrhghxxjjhrrjjhj


内容的提问来源于stack exchange,提问作者Chinu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 04:15:08