8

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

这是我想要做的事情:假设我有一个字符串'abcdefghijkl'并想用A替换结束符号(k)的二维。我收到一个错误:

>>> 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

subst 的非暴力代码是什么?

4

5 回答 5

16

如果您要替换的位置始终相同,则可以执行以下操作:

>>> 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
于 2010-08-23T18:07:56.680 回答
11
TypeError: 'str' object does not support item assignment

这是意料之中的——python 字符串是不可变的。

一种方法是做一些切片和切块。像这样:

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

连接的结果changed将是另一个不可变字符串。请注意,这不是适合所有替代方案的通用解决方案。

于 2010-08-23T18:07:06.240 回答
5

您必须将其切片并实例化一个新字符串,因为字符串是不可变的:

aa = aa[:-2] + 'A' + aa[-1:]
于 2010-08-23T18:08:58.640 回答
4

另一种方法:

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

Python 中的字符串是不可变的序列——非常像元组。您可以从字符串或元组创建一个可变的列表,更改相关索引并将列表转换回带有jointuple带有元组构造函数的字符串。

编辑:如果是字符串,您可以使用 bytearray ( docs ) 类型而不是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已弃用且在 Py3k 中不可用(我认为您仍然可以编写自己的类)。

于 2010-08-23T18:20:56.953 回答
3

回复其他帖子的评论:

要直接用字符串进行三个字符替换(另请参见 bytearray 帖子),您可以使用序列进行分区,特别是如果您不知道不搜索的位置:

aa = 'abcdefghijkl'
replace = 'def'
withstring = 'QRS'
newstr,found,endpart = aa.partition(replace)

if found:
    newstr+=withstring+endpart
    print newstr
else:
    print "%r string is not in %r" % (replace,aa)

在这种情况下,替换的长度不需要与原件匹配。

于 2010-08-23T19:39:46.257 回答