'123456'
の3番目と4番目の位置にある'34'
を'ab'
で置き換えた文字列('12ab56'
)が取得したい時
方法は3つある(ほかにもたくさんありそうだけど...)
- strを一度、listにしてから置き換える
- 置き換える文字の前後をsliceで取得し、結合する
-
replace()
で置き換える(失敗)
strを一度、listにしてから置き換える
strで指定位置を置き換えようとするとエラーになる
>>> s = '123456'
>>> s[2:4] = 'ab'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
'str' object does not support item assignment
'str'オブジェクトはアイテム割り当てをサポートしていません
だから、一度listにしてから置き換える
>>> s = list('123456')
>>> s[2:4] = 'ab'
>>> s
['1', '2', 'a', 'b', '5', '6']
>>> "".join(s)
'12ab56'
この方法で、リストデータの内容を書き換え、文字を置き換えた新たな文字列を作り出せる。
置き換える文字の前後をsliceで取得し、結合する
>>> s = '123456'
>>> s[:2] + 'ab' + s[4:]
'12ab56'
この方法でも、文字を置き換えた新たな文字列を作り出せる。
replace()
を使う(位置を指定した置き換えには使えない)
replace()
を使うことでも実現できると思ってやったみた。
でも、もし、指定位置の文字が前にあったときに、意図しない結果になってしまうため、replace()
ではだめ
# この場合はOK
>>> s = '123412'
>>> s.replace(s[:2], 'ab', 1)
'ab3412'
指定位置の前に同じ文字があるため、意図しない結果になる
# '1234ab'となってほしかった
>>> s = '123412'
>>> s.replace(s[4:6], 'ab', 1)
'ab3412'