替换给定索引范围的子字符串

时间:2018-09-19 15:39:19

标签: python python-3.x

我是Python编程的新手。我被困在某一点。假设我有字符串“ hello-world”。我想用“ *”替换该字符串的所有字符,除了第一个和最后一个。因此结果将为"h***-****d"

执行此操作的一种方法如下:

In [1]: s = "hello-world"

In [2]: s[0] + "*"*(len(s)-2) + s[-1]
Out[2]: 'h*********d'

如果我想用“ *”替换所有字符,除了前2个字符和后2个字符

In [3]: s[:2] + "*"*(len(s)-4) + s[-2:]
Out[3]: 'he*******ld'

有没有解决这些类型问题的漂亮方法。任何帮助,将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:0)

您可以定义一个不重复自己的函数:

def replace(s, n):
    if len(s) > n*2:
        return s[:n] + '*'*(len(s)-n*2) + s[-n:]
    return s

print(replace('hello-world', 1))  # h*********d
print(replace('hello-world', 2))  # he*******ld
print(replace('hello', 2))  # he*lo
print(replace('hello', 3))  # hello

您还可以使用某种字符串格式来代替串联(这应该更有效),例如f-strings适用于3.6及更高版本:

def replace(s, n):
    if len(s) > n*2:
        return f"{ s[:n] }{ '*'*(len(s)-n*2) }{ s[-n:] }"
    return s

答案 1 :(得分:0)

我认为您想做的是这样

def obscure(string, n):
    characters = list(string)
    characters[n:-n] = '*' * len(characters[n:-n])
    obscured = ''.join(characters)
    return obscured

将字符串转换为字符列表。替换您要遮盖的那些。然后将列表重新加入字符串。

答案 2 :(得分:0)

您可以使用str.join(和string模块来检查字母):

s[0] + ''.join(['*' if i in string.ascii_letters else i
                for i in s[1:-1]]) + s[-1]

由于您说过想用h****-****d代替连字符,因此您需要测试字符是否为字母。您可以将string.ascii_letters更改为:

chars = 'abcdefghijklmnopqrstuvwxyz'
chars = chars + chars.upper() + '0123456789'  # + 'some_other_chars'

...如果要包含其他字符,例如数字或标点符号。或者,您可以写出要手动替换的字母。

您可能还想执行检查以查看字符串是否为3个字符或更多,以免出现错误。

答案 3 :(得分:-2)

您可以尝试一下。

s="hello-world"

for i in s[1:-1]:
   if i.isalpha():
     s=s.replace(i,"*")