8


1

Pythonで文字列の一部を置き換える方法は?

Pythonで別の文字列内の文字セットを置き換える方法は?

私がやろうとしていることは次のとおりです。「abcdefghijkl」という文字列があり、終了記号(k)の2-dをAに置き換えたいとします。 エラーが出ます:

>>> aa = 'abcdefghijkl'
>>> print aa[-2]
k
>>> aa[-2]='A'

Traceback (most recent call last):
  File "", line 1, in
    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


常に同じ位置にある場合、次のようなことができます:

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


10


TypeError: 'str' object does not support item assignment

これは予想されることです-Python文字列は不変です。

1つの方法は、スライスとダイシングを行うことです。 このような:

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

連結の結果、 `changed`は別の不変の文字列になります。 気を付けてください、これはすべての代替シナリオに適合する一般的なソリューションではありません。


5


文字列は不変なので、スライスして新しい文字列をインスタンス化する必要があります。

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


2


これを行う別の方法:

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

Pythonの文字列は不変のシーケンスです-タプルに非常によく似ています。 文字列またはタプルから変更可能なリストを作成し、関連するインデックスを変更し、リストを「join」で文字列に戻すか、タプルコンストラクタで「tuple」に戻すことができます。

*編集:*文字列の場合、 `list`の代わりにbytearray(http://docs.python.org/py3k/library/functions.html#bytearray[docs])型を使用できます。これにより、文字列への変換が可能になります。 `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では使用できません(独自のクラスを作成できると思います)。


2


他の投稿のコメントに返信するには:

文字列で直接3文字の置換を行うには(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)

この場合、置換の長さは元の長さと一致する必要はありません。