为啥第一次通话后'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'没有被全部替换?的主要内容,如果未能解决你的问题,请参考以下文章

为啥每次单元测试后我的数据库都没有被清除?

postgresql:合并行保留一些信息,没有循环

为啥第一次登录后没有数据?

js的replace如何全部替换目标字符串

为啥 gprof 告诉我一个只从 main() 调用一次的函数被调用了 102 次?

有没有办法在Android的一次通话中取消订阅所有解析通道