8

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

これが私がやろうとしていることです: 文字列 'abcdefghijkl' があり、最後の記号 (k) の 2-d を 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

サブストのブルートフォースではないコードは何でしょうか?

4

5 に答える 5

16

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

>>> 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
于 2010-08-23T18:07:56.680 に答える
11
TypeError: 'str' object does not support item assignment

これは当然のことです - Python 文字列は不変です。

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

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

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

于 2010-08-23T18:07:06.240 に答える
5

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

aa = aa[:-2] + 'A' + aa[-1:]
于 2010-08-23T18:08:58.640 に答える
4

これを行う別の方法:

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 では使用できません (独自のクラスを作成することはまだ可能だと思います)。

于 2010-08-23T18:20:56.953 に答える
3

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

文字列で直接 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)

この場合、置換の長さはオリジナルと一致する必要はありません。

于 2010-08-23T19:39:46.257 に答える