我想使用python替换字符串中的子字符串的交替出现

我想使用python替换字符串中的子字符串的交替出现,python,string,Python,String,我有一根绳子。我想用一个新的子字符串替换每个备用子字符串,以便在下面的字符串中,第一次和第三次出现的xx应更改为rr #------------------------------------------------------ import re str1="abcxxhghxxjjhxxjjhj" cnt=0 for i in re.finditer("xx",str1): cnt=cnt+1 if cnt%2!=0:

我有一根绳子。我想用一个新的子字符串替换每个备用子字符串,以便在下面的字符串中,第一次和第三次出现的
xx
应更改为
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.sub来处理这个问题:

str1=“abcxhghxxjhxxjjhj”
output=re.sub(r'xx(.*)(xx |$)',r'rr\1\2',str1)
打印(输出)#abcrrhghxxjjhrjjjj
该策略是找到
xx
,然后找到最近的
xx
,然后将第一个
xx
替换为
rr
,剩下的内容就不用处理了。下面是对正则表达式模式的解释:

xx匹配“xx”
(.*)匹配并捕获所有内容,直到
(xx |$)最近的下一个“xx”或输入的结尾

然后,我们将其替换为
rr\1\2
,只将前导的
xx
更改为
rr

,我们实际上可以通过调用
re.sub来处理这个问题:

#------------------------------------------------------ 
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)
str1=“abcxhghxxjhxxjjhj”
output=re.sub(r'xx(.*)(xx |$)',r'rr\1\2',str1)
打印(输出)#abcrrhghxxjjhrjjjj
该策略是找到
xx
,然后找到最近的
xx
,然后将第一个
xx
替换为
rr
,剩下的内容就不用处理了。下面是对正则表达式模式的解释:

xx匹配“xx”
(.*)匹配并捕获所有内容,直到
(xx |$)最近的下一个“xx”或输入的结尾
然后,我们将其替换为
rr\1\2
,仅将前导的
xx
更改为
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)
for i in re.finditer("xx",str1):
    cnt=cnt+1    
    if cnt%2!=0:
        str1 = str1[:i.start()] + "rr" + str1[i.start() + 2:]
使用re.finditer索引切片字符串应该可以:

for i in re.finditer("xx",str1):
    cnt=cnt+1    
    if cnt%2!=0:
        str1 = str1[:i.start()] + "rr" + str1[i.start() + 2:]

使用re.finditer索引对字符串进行切片

,但更喜欢上面的答案,它应该更有效,但更喜欢上面的答案,它应该更有效