как заменить часть строки в Python?
Как заменить набор символов внутри другой строки в Python?
вот что я пытаюсь сделать: предположим, у меня есть строка "abcdefghijkl" и я хочу заменить 2-d из символа конца (k) На A. я получаю ошибку:
>>> 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
что бы не перебрать код для замест?
5 ответов
Если это всегда одна и та же позиция, которую вы заменяете, вы можете сделать что-то вроде:
>>> 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
TypeError: 'str' object does not support item assignment
этого и следовало ожидать-строки python неизменяемы.
один из способов-сделать нарезку и нарезку кубиками. Вот так:
>>> aa = 'abcdefghijkl'
>>> changed = aa[0:-2] + 'A' + aa[-1]
>>> print changed
abcdefghijAl
результат конкатенации, changed
будет другой неизменяемой строкой. Имейте в виду, что это не универсальное решение, которое подходит для всех сценариев подстановки.
вы должны разрезать его и создать экземпляр новой строки, так как строки неизменяемы:
aa = aa[:-2] + 'A' + aa[-1:]
другой способ сделать это:
s = "abcdefghijkl"
l = list( s )
l[-2] = 'A'
s = "".join( l )
строки в Python являются неизменяемыми последовательностями - очень нравятся кортежи. Вы можете сделать список, который является изменяемым, из строки или кортежа, изменить соответствующие индексы и преобразовать список обратно в строку с помощью join
или tuple
С конструктор кортежа.
EDIT: в случае строк вы можете использовать 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 (вы все еще можете написать свой собственный класс, я думаю).
чтобы ответить на комментарий другого поста:
чтобы сделать подстановку трех символов непосредственно со строками (см. Также сообщение 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)
длина замены не должна соответствовать оригиналу в этом случае.