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

11

如何在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

什么是替换的非暴力代码?

https://dev59.com/y3A75IYBdhLWcg3wH1NB#3463847 - killown
5个回答

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

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

这是可以预期的 - Python字符串是不可变的。

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

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

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


你少了一个尾随的 'l' 字符。 - sholsapp

5

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

aa = aa[:-2] + 'A' + aa[-1:]

5

另一种方法是:

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

Python中的字符串是不可变序列,非常类似于元组。您可以从字符串或元组创建可变的列表,更改相关索引,并使用join将列表转换回字符串,或使用元组构造函数将其转换为tuple

编辑:在字符串的情况下,您可以使用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已被弃用且在Py3k中不可用(您仍然可以编写自己的类)。

1
振作起来,你还有 bytearray - John La Rooy
@gnibbler 我很惊讶。我不知道这种类型存在,谢谢。 - cji

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)

替换的长度在这种情况下不需要与原始内容匹配。

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