为啥第一次通话后'ana'没有被全部替换?
Posted
技术标签:
【中文标题】为啥第一次通话后\'ana\'没有被全部替换?【英文标题】:why isn t 'ana' replaced all over after the first call?为什么第一次通话后'ana'没有被全部替换? 【发布时间】:2021-12-19 10:11:15 【问题描述】:为什么只在第二次调用后才将 'ana' 替换为 'banana'? 请帮忙:
prop="ana anastasia ana ana re ana ana mere ana"
prop=" "+prop+" "
s = 'ana'
t = 'banana'
prop=prop.replace(" "+s+" "," "+t+" ")
print(prop) # banana anastasia banana ana re banana ana mere banana
prop=prop.replace(" "+s+" "," "+t+" ")
print(prop) # banana anastasia banana banana re banana banana mere banana
【问题讨论】:
您正在向"ana"
添加一个空格
字符串是“... ana ana ...”,您正在搜索“ ana ”。该字符串被解释为 "..." " ana " "ana ...",因此第二个 "ana" 不匹配。
【参考方案1】:
在您的第一次评估中,_ana_ana_
被读作_ana_
+ana_
(注意,为清楚起见,空格作为下划线 (_
))。
只有第一个满足被替换的条件,第二个在第一个_ana_
字符串被消耗后会漏掉一个空格。
您需要与ana
个单词一样多的替换词,每个单词之间用一个空格分隔。
一种解决方法是使用带有\b
作为单词分隔符的正则表达式:
prop="ana anastasia ana ana re ana ana mere ana"
import re
re.sub(rf'\bs\b', t, prop)
输出:'banana anastasia banana banana re banana banana mere banana'
【讨论】:
【参考方案2】:我用 _ 表示空间。
在这里,当您将 "ana" 替换为 "banana" 时,整个 "_ana_"
将被替换。替换后连空格都被替换了,所以光标会直接跳转到next ana的“a”,所以不会替换这个。第二次通话后,我们有"_ana_"
所以这次它将再次将其替换为香蕉,您将获得所需的结果。这里的重点是:
替换后光标会直接跳转到下一个ana的“a”
相反,您可以使用 split() 函数并检查每个单词,如果是 =="ana" 则将其更改为 "banana"
prop="ana anastasia ana ana re ana ana mere ana"
s1=""
for i in prop.split():
if i=="ana":
s1+="banana"+" "
else:
s1+=i+" "
print(s1) # banana anastasia banana banana re banana banana mere banana
【讨论】:
这会给bananastasia
;) 你的输出不正确
这个解释和我的很相似,我不会说这是错误的:p。关于您的代码,重复添加到字符串效率低下(每次都需要构造整个字符串),最好使用列表并在最后加入。
@mozway 评论区看起来很乱,让我们删除 cmets以上是关于为啥第一次通话后'ana'没有被全部替换?的主要内容,如果未能解决你的问题,请参考以下文章