替换字符串中的每第N个字母(Replace every nth letter in a string

2019-07-04 09:27发布

我正在写一个函数从一个字符串替换每个第n个字母

def replaceN(str, n):
   for i in range(len(str)):
     n=str[i]
     newStr=str.replace(n, "*")
     return newStr

但是当我执行它,只有第一个字母被替换为*。 我敢肯定有错,但我不能看到它。

Answer 1:

一内胆:

newstring = ''.join("*" if i % n == 0 else char for i, char in enumerate(string, 1))

扩展:

def replace_n(string, n, first=0):
    letters = (
        # i % n == 0 means this letter should be replaced
        "*" if i % n == 0 else char

        # iterate index/value pairs
        for i, char in enumerate(string, -first)
    )
    return ''.join(letters)
>>> replace_n("hello world", 4)
'*ell* wo*ld'
>>> replace_n("hello world", 4, first=-1)
'hel*o w*orl*'


Answer 2:

你的代码中有几个问题:

首先, return放错了地方。 这是里面的for循环,但它应该是外面。 接着,在下面的片段:

for i in range(len(str)):
    n=str[i]
    newStr=str.replace(n, "*")

n你的第二个参数,以你的函数传递在每个循环步骤被覆盖。 所以,如果你的初始字符串为“abcabcabcd”和你通过N = 3(数字)作为第二个参数你的循环的作用是:

n="a"
n="b"
n="c"
...

所以值3从未使用过。 此外,你的循环只在您的字符串进行上次更换保存:

n="a"
newStr="abcabcabcd".replace("a", "*") --> newStr = "*bc*bc*bcd"
n="b"
newStr="abcabcabcd".replace("b", "*") --> newStr = "a*ca*ca*cd"
...
n="d"
newStr="abcabcabcd".replace("d", "*") --> newStr = "abcabcabc*"

如果要测试功能(固定后return一些字符串它似乎很好地工作位置):

In [7]: replaceN("abcabcabc", 3)
Out[7]: 'ab*ab*ab*'

但如果你更仔细地做了选择:

In [10]: replaceN("abcabcabcd", 3)
Out[10]: 'abcabcabc*'

那么很明显,代码失败,就相当于只更换您的字符串的最后一个字符:

my_string.replace(my_string[-1], "*")

由Eric给出的代码是工作的罚款:

In [16]: ''.join("*" if i % 3 == 0 else char for i, char in enumerate("abcabcabcd"))
Out[16]: '*bc*bc*bc*'

它取代了位置3,6,9号等。 它可能需要一些调整,如果你不想要的位置0被替换过千万。



Answer 3:

试试这个:

def replaceN(string, n):
    s = ''
    for i in range(len(string)):
        if i%n!=0:
            s += string[i]
        else:
            s += '*'
    return s


Answer 4:

你已经把循环内你的回报,因此返回字符串的第一次迭代后没有串的其余部分被替换。 一旦循环已经完全结束的字符串应该返回。 像这样的东西应该工作:

def replaceN(str, n):
    for i in range(len(str)):
        n=str[i]
        newStr=str.replace(n, "*")
    return newStr


Answer 5:

另一种选择,重新使用:

import re
def repl(matchobj):
    return re.sub('.$','*',matchobj.group(0))
def replaceN(str, n):
    return re.sub('.'*n,repl,str)

然而,这需要额外的库。 如果你有这样的图书馆已经进口的,这可能是一个速记方法。



Answer 6:

我喜欢Eric的答案,但你的评论指出,第一个字母不应该被更换。 你能适应这样便代码:

''.join("*" if i % n == 0 else char for i, char in enumerate(string, 1))
                                             the difference is here  ^

def replaceN(s, n):
    return ''.join(
      '*' if not i%n else char for i, char in enumerate(s, 1))

>>> replaceN('welcome', 3)
'we*co*e'


Answer 7:

一个简单的方式,通过每一次重新定义字符串:

def replaceN(string, n):
    for i in range(n, len(string), n):
        string = string[:i-1] + "*" + string[i:]
    return string


In [1]: replaceN("abcabcabc", 3)
Out[1]: ab*ab*ab*
In [2]: replaceN("abcd abcd abcd", 4)
Out[2]: abcd*abcd*abcd


文章来源: Replace every nth letter in a string