2010-08-23 60 views
5

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

这里是我想要做的事:让我们说我有一个字符串“ABCDEFGHIJKL”,并希望从结尾符号(K)与A.我得到一个错误更换2-d:

>>> 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的非暴力代码?

+0

http://stackoverflow.com/questions/3463746/in-place-string-modifications-in-python/3463847#3463847 – killown 2010-08-23 20:46:25

回答

12

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

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

如果替换长度超过1个符号会怎么样? 'AAA'而不是'A'。我需要替换原始字符串中的三个符号(不是三个符号,但与替换长度相同)。 – user63503 2010-08-23 19:07:36

+0

@摄影师:看我的编辑。 – eldarerathis 2010-08-23 20:05:59

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

这是可以预料的 - python字符串是不可变的。

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

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

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

+0

你错过了最后的'l'字符。 – sholsapp 2010-08-23 18:09:17

+0

@gnucom:谢谢。修复。 – 2010-08-23 18:11:15

+0

+1。感谢那。 – sholsapp 2010-08-23 19:27:06

4

你必须切片它和实例化一个新的字符串,因为字符串是不可变的:

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

另一种方式来做到这一点:

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

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

编辑:在字符串的情况下,你可以使用字节组(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不可用(你仍然可以写自己的类,我认为)。

+0

振作起来,你还有'bytearray' – 2010-08-23 18:43:25

+0

@gnibbler我很惊讶。我不知道这种类型的存在,谢谢。 – cji 2010-08-23 19:08:15

1

要回复其他岗位的评论:

了对字符串进行三次字符替换直接(另见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) 

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

相关问题