如何使用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
相关产品推荐
相关产品推荐

