Как заменить часть строки в Python? - PullRequest
8 голосов
/ 23 августа 2010

Как заменить набор символов внутри другой строки в Python?

Вот что я пытаюсь сделать: скажем, у меня есть строка 'abcdefghijkl' и я хочу заменить 2-й изсимвол конца (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 ]

15 голосов
/ 23 августа 2010

Если вы всегда меняете одну и ту же позицию, вы можете сделать что-то вроде:

>>> 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
11 голосов
/ 23 августа 2010
TypeError: 'str' object does not support item assignment

Этого следовало ожидать - строки Python неизменны.

Один из способов - сделать нарезку и нарезать кубиками.Например:

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

В результате объединения changed будет другой неизменной строкой.Имейте в виду, это не общее решение, которое подходит для всех сценариев замещения.

5 голосов
/ 23 августа 2010

Вы должны нарезать ее и создать новую строку, так как строки неизменны:

aa = aa[:-2] + 'A' + aa[-1:]
2 голосов
/ 23 августа 2010

Чтобы ответить на комментарий к другому сообщению:

Чтобы сделать трехсимвольную замену непосредственно строками (см. Также сообщение 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)

Длина замены в этом случае не обязательно должна соответствовать оригиналу.

2 голосов
/ 23 августа 2010

Еще один способ сделать это:

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

Строки в Python являются неизменяемыми последовательностями - очень похожи на кортежи. Вы можете создать изменяемый список из строки или кортежа, изменить соответствующие индексы и преобразовать список обратно в строку с помощью join или в tuple с помощью конструктора кортежа.

РЕДАКТИРОВАТЬ: в случае строк вы можете использовать тип 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 (я думаю, вы все еще можете написать свой собственный класс).

...