2010-08-23 93 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) 

在這種情況下,替換的長度不需要與原來的匹配。

相關問題