如何在Python中替换字符串的一部分?

11 投票
5 回答
49193 浏览
提问于 2025-04-16 03:11

如何在Python中替换一个字符串中的一组字符?

我想做的是:假设我有一个字符串'abcdefghijkl',我想把从末尾数第二个字符(k)替换成A。但是我遇到了一个错误:

>>> aa = 'abcdefghijkl'
>>> print aa[-2]
k
>>> aa[-2]='A'

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    aa[-2]='A'
TypeError: 'str' object does not support item assignment

所以,我的问题是:有没有一种优雅的方法可以从指定位置开始,在一个字符串中替换(替代)另一个字符串的字符?类似于:

# subst(whole_string,symbols_to_substiture_with,starting_position)

>>> print aa
abcdefghijkl
>>> aa = subst(aa,'A',-2)
>>> print aa
abcdefghijAl

有没有什么简单的方法可以实现这个替换?

5 个回答

5

还有一种方法可以做到这一点:

s = "abcdefghijkl"
l = list( s )
l[-2] = 'A'
s = "".join( l )

在Python中,字符串是不可变的序列,这点跟元组很像。你可以从字符串或元组创建一个列表,列表是可变的。然后你可以修改列表中的某些位置,最后再用 join 方法把列表变回字符串,或者用元组构造器把它变回元组。

补充说明:对于字符串,你可以使用 bytearray文档)类型来代替 list,这样就可以用 str 构造器把它转换成字符串。

另外,你可以自己实现一个,或者使用标准库中的这个类:http://docs.python.org/library/userdict.html#UserString.MutableString,可以这样做:

>>> from UserString import MutableString
>>> s = MutableString( "zdfgzbdr " )
>>> s
'zdfgzbdr '
>>> s[1:5]
'dfgz'
>>> s[1:5] = "xxxx"
>>> s
'zxxxxbdr '

可惜的是,MutableString 已经被弃用了,在Python 3中不可用(不过你仍然可以自己写一个类,我想)。

12
TypeError: 'str' object does not support item assignment

这是正常现象——在Python中,字符串是不可变的。

一种方法是进行一些切片和拼接。像这样:

>>> aa = 'abcdefghijkl'
>>> changed  = aa[0:-2] + 'A' + aa[-1]
>>> print changed
abcdefghijAl

拼接的结果,changed,将会是另一个不可变的字符串。需要注意的是,这并不是适用于所有替换情况的通用解决方案。

20

如果你要替换的位置总是一样的,你可以这样做:

>>> s = s[0:-2] + "A" + s[-1:]
>>> print s
abcdefghijAl

在一般情况下,你可以这样做:

>>> rindex = -2 #Second to the last letter
>>> s = s[0:rindex] + "A" + s[rindex+1:]
>>> print s
abcdefghijAl

补充:如果你想在替换时只重复一个字母的情况,应该这样做:

>>> s = "abcdefghijkl"
>>> repl_str = "A"
>>> rindex = -4 #Start at 4th character from the end
>>> repl = 3 #Replace 3 characters
>>> s = s[0:rindex] + (repl_str * repl) + s[rindex+repl:]
>>> print s
abcdefghAAAl

撰写回答