2010-08-23 14 views
5

Jak zamienić zestaw znaków wewnątrz innego ciągu w Pythonie?jak zastąpić część ciągu w python?

Oto, co usiłuję zrobić: powiedzmy, że mam ciąg „ABCDEFGHIJKL” i chcą wymienić 2-D z symbolem końcowego (K) A ja otrzymuję błą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 

Pytanie: czy istnieje elegancki sposób na zastąpienie (zastąpienie) znakami w innym ciągu zaczynając od określonej pozycji? Coś jak:

# subst(whole_string,symbols_to_substiture_with,starting_position) 

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

Jaki byłby kod nie-brute-force na subst?

+0

http://stackoverflow.com/questions/3463746/in-place-string-modifications-in-python/3463847#3463847 – killown

Odpowiedz

12

Jeśli jest to zawsze ta sama pozycja jesteś zastąpienie, można zrobić coś takiego:

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

W ogólnym przypadku można zrobić:

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

EDIT: bardzo ogólny przypadek, jeśli chcesz po prostu powtórzyć pojedynczą literę w zastępstwie:

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

Co się stanie, jeśli podstawienie jest dłuższe niż 1 symbol? "AAA" zamiast "A". I muszę wymienić trzy symbole w oryginalnym łańcuchu (nie jeden z trzema, ale o tej samej długości co podstawienie). – user63503

+0

@photographer: Zobacz moją edycję. – eldarerathis

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

Tego można się spodziewać - ciągi Pythona są niezmienne.

Jednym ze sposobów jest krojenie i krojenie. Tak:

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

wynikiem konkatenacji, changed będzie kolejnym niezmienny ciąg. Pamiętaj, to nie jest ogólne rozwiązanie, które pasuje do wszystkich scenariuszy zastępowania.

+0

Tęsknisz za znakiem "l". – sholsapp

+0

@gnucom: Dzięki. Naprawione. –

+0

+1. Dziękuję za to. – sholsapp

4

Trzeba pokroić go i wystąpienia nowy ciąg, ponieważ ciągi są niezmienne:

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

Innym sposobem, aby to zrobić:

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

Struny w Pythonie są niezmienne sekwencje - bardzo podobnie jak krotki. Możesz utworzyć listę, która jest zmienna, z ciągu lub krotki, zmień odpowiednie indeksy i przekształć listę z powrotem na ciąg znaków z join lub w tuple z krotnym konstruktorem.

EDIT: w przypadku ciągów można użyć ByteArray (docs) wpisać zamiast list, co czyni możliwym przekształcania ciąg z str konstruktora.

Ponadto, można zaimplementować własną rękę lub skorzystać z tej klasy z biblioteki standardowej: http://docs.python.org/library/userdict.html#UserString.MutableString tak:

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

niestety - MutableString jest przestarzała i nie są dostępne w Py3k (można jeszcze napisać własną klasę, ja myśleć).

+0

Cheer up, nadal masz 'bytearray' –

+0

@gnibbler Jestem zdumiony. Nie wiedziałem, że ten typ istnieje, dzięki. – cji

1

Aby odpowiedzieć komentarz z innego wątku:

poczynić trzy zastąpienie znaków bezpośrednio z ciągów (patrz również stanowisko tablicaBitowa) można zrobić partycję z sekwencją, zwłaszcza jeśli nie znają miejsce bez szukania:

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) 

Długość wymiany nie musi być zgodna z oryginałem w tym przypadku.

Powiązane problemy