替换字符串中的字符实例

189

这段简单的代码旨在将指定位置的分号替换为冒号,但是并没有起作用:

for i in range(0,len(line)):
     if (line[i]==";" and i in rightindexarray):
         line[i]=":"

它会报错

line[i]=":"
TypeError: 'str' object does not support item assignment

我该如何解决这个问题,把分号替换成冒号?使用 replace 函数并不可行,因为它不接受索引参数。有些分号我可能并不想要替换。

示例

在字符串中,我可能有任意数量的分号,例如“嘿!; 你好; !;”

我知道要替换哪些分号(我已经知道它们在字符串中的索引)。使用 replace 函数不起作用,因为我不能在其中使用索引。


1
你知道 str.replace()BIF 吗? - LarsVegas
2
是的,正如我在问题中解释的那样。我还解释了为什么那对我不起作用。 - The Unfun Cat
1
你需要更明确地说明什么构成了有效的替换; 如果可变,你的不起作用的代码将替换字符串中的所有分号。 - Martijn Pieters
2
@TheUnfunCat:你是如何获取这些索引的?整个问题可能有更好的解决方案(例如正则表达式)。 - nneonneo
可能是在Python中更改字符串中的一个字符?的重复问题。 - Wolf
显示剩余3条评论
17个回答

318

Python中的字符串是不可变的,因此您不能将它们视为列表并分配索引。

请改用 .replace()

line = line.replace(';', ':')
如果你只需要替换 某些 分号,你需要更具体地说明。可以使用切片来隔离需要替换的字符串部分:
line = line[:10].replace(';', ':') + line[10:]

这将替换字符串前10个字符中的所有分号。


这个能处理Unicode字符吗?对我来说好像不起作用。 - Steven2163712
2
@Steven2163712:所有文本都是Unicode编码,因此对于所有字符都可以正常工作。如果没有具体的示例,我无法帮助您解决特定的问题。 - Martijn Pieters

71

如果您不想使用.replace(),您可以按照下面的步骤,在给定索引处将任何字符替换为相应的字符。

word = 'python'
index = 4
char = 'i'

word = word[:index] + char + word[index + 1:]
print word

o/p: pythin

9
这应该是被接受的答案,直接回答了问题。这是我迄今为止找到的最简单的方法。 - Flare Cat
如果索引+1超出范围怎么办? - stochastic
如果 index >= len(word),你可以忽略替换。 - Dineshs91

24
将字符串转换为列表,然后你就可以逐个更改字符。最后,你可以使用 .join 将其重新组合起来:
s = 'a;b;c;d'
slist = list(s)
for i, c in enumerate(slist):
    if slist[i] == ';' and 0 <= i <= 3: # only replaces semicolons in the first part of the text
        slist[i] = ':'
s = ''.join(slist)
print s # prints a:b:c;d

6
如果你想要替换单个分号:
for i in range(0,len(line)):
 if (line[i]==";"):
     line = line[:i] + ":" + line[i+1:]

不过尚未进行测试。


3
可以实现(+1),但效率相对较低,因为每遇到一个 ';' 都会创建一个新的字符串。 - inspectorG4dget
@inspectorG4dget,你是对的,这只是一个快速而粗略的——仅限一次——解决方案。 - Vic
实际上,@inspectorG4dget,被接受的答案不是也有同样的问题吗? - Vic
2
line.replace(src,dst) 无法实现替换。line[:10].replace(src,dst) + line[10:] 可以实现,但效率较低。假设 line = ';'*12。你的解决方案将会构建一个新字符串12次。而优化后的解决方案只需要构建一次即可。 - inspectorG4dget

3

你不能简单地为字符串中的字符赋值。使用以下方法替换特定字符的值:

name = "India"
result=name .replace("d",'*')

输出:In*ia

另外,如果你想要替换第一个字符以外的所有首字母出现的*,例如字符串 = babble 输出 = ba**le

代码:

name = "babble"
front= name [0:1]
fromSecondCharacter = name [1:]
back=fromSecondCharacter.replace(front,'*')
return front+back

3

这应该涵盖了一个稍微更一般的情况,但您应该能够根据您的目的进行自定义。

def selectiveReplace(myStr):
    answer = []
    for index,char in enumerate(myStr):
        if char == ';':
            if index%2 == 1: # replace ';' in even indices with ":"
                answer.append(":")
            else:
                answer.append("!") # replace ';' in odd indices with "!"
        else:
            answer.append(char)
    return ''.join(answer)

2

在不创建单独列表的情况下有效使用.replace()方法来处理字符串。例如,考虑包含一些空格的字符串的列表“username”,我们希望将每个用户名字符串中的空格替换为下划线。

names = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]
usernames = []

要替换每个用户名中的空格,请考虑使用Python中的range函数。

for name in names:
    usernames.append(name.lower().replace(' ', '_'))

print(usernames)

或者如果您想使用一个列表:

for user in range(len(names)):
   names[user] = names[user].lower().replace(' ', '_')

print(names)

1
这个怎么样:
sentence = 'After 1500 years of that thinking surpressed'

sentence = sentence.lower()

def removeLetter(text,char):

    result = ''
    for c in text:
        if c != char:
            result += c
    return text.replace(char,'*')
text = removeLetter(sentence,'a')

0
如果您要根据变量'n'中指定的索引值进行替换,则请尝试以下操作:
def missing_char(str, n):
 str=str.replace(str[n],":")
 return str

2
这个解决方案的问题在于它会替换位置 n 上所有出现的字符,而提问者只想替换特定的出现次数。 - shivram.ss
确切地说,这是一个糟糕的解决方案! - Erhard Dinhobl
只需检查我的答案,即可将一个字符替换为索引。 - Alberto Perez

0

我尝试使用这个作为2合1的替代品

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

# write your for loop here
for user in range(0,len(usernames)):
    usernames[user] = usernames[user].lower().replace(' ', '_')

print(usernames)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接