我想使用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索引对字符串进行切片,但更喜欢上面的答案,它应该更有效,但更喜欢上面的答案,它应该更有效