No.035【Python】文字列の置換について②

![python-logo-master-v3-TM-flattened.png](https://qiita-image-store.s3.amazonaws.com/0/336067/8fb9f6aa-57f7-dc4b-b4bf-a648969d315c.png)

####[前回に引き続き](https://qiita.com/You-Tarin/items/3a98f6c6aa958b4c9826)、「文字列の置換」について書いていきます。
I'll write continuousy about the replacement of strings in python" on this page.

###■ 正規表現による置換： re.sub ／ re.subn
&emsp;The replacement by Regular expression：re.sub, re.subn

```
>>> # 置換元文字列と完全一致の場合、置換される(replace()・translate()関数)
>>> # 完全一致出ない置換の場合は、reモジュール sub()関数を利用する
>>> 
>>> import re
>>> 
>>> w = 'aaa@egg.com bbb@salt.com ccc@mastard.com'
>>> 
>>> print(re.sub("[a-z]*@", "ABC@", w))
ABC@egg.com ABC@salt.com ABC@mastard.com
>>> 
>>> 
>>> # replace()同様、第四引数(count)に最大置換回数の指定が可能
>>> 
>>> print(re.sub('[a-z]*@', 'ABC@', w, 2))
ABC@egg.com ABC@salt.com ccc@mastard.com
```

``` 
>>> # 複数の文字列を同文字列へ置換
>>> 
>>> import re
>>> 
>>> w = 'aaa@xxx.com bbb@yyy.com ccc@zzz.com'
>>> 
>>> print(re.sub("[xyz]", "1", w))
aaa@111.com bbb@111.com ccc@111.com
>>> # ↑複数の異なる文字を同じ文字列に置換する場合に利用する
``` 

```
>>> # |で区切るといずれかのパターンにマッチする
>>> # 正規表現の特殊文字利用も可、文字列をそのまま指定しても可能
>>> # 複数の異なる文字列を同じ文字列に置換する場合に利用する
>>> 
>>> import re
>>> 
>>> w = 'aaa@xxx.com bbb@yyy.com ccc@zzz.com'
>>> 
>>> print(re.sub('aaa|bbb|ccc', 'ABC', w))
ABC@xxx.com ABC@yyy.com ABC@zzz.com
```

``` 
>>> # 一致箇所を使った置換
>>> # パターンの一部を()で囲む：()内の一致する文字列を利用することが可能
>>> 
>>> print(re.sub('([a-z]*)@', '\\1-123@', w))
aaa-123@xxx.com bbb-123@yyy.com ccc-123@zzz.com
>>> 
>>> 
>>> print(re.sub('([a-z]*)@', r'\1-123@', w))
aaa-123@xxx.com bbb-123@yyy.com ccc-123@zzz.com
>>> 
>>> 
>>> # ↑ \1 が()に一致した箇所に対応。()が吹く風の場合は \2,\3とする
>>> # ↑ '',””で囲まれた文字列は、\\1の様に\をエスケープすることが必要
>>> # ↑ r""の様に先頭にrをつけるraw文字列の場合、\1で問題ない
```

```
>>> # 置換箇所の個数取得
>>> # 置換された文字列と置換部分の個数とタプルを返す

>>> t = re.subn('[a-z]*@', 'ABC@', w)
>>> 
>>> print(t)
('ABC@xxx.com ABC@yyy.com ABC@zzz.com', 3)
>>> 
>>> print(type(t))
<class 'tuple'>
>>> 
>>> print(t[1])
3
```

``` 
>>> # 辞書ではなく、3つの文字列を引数として指定することも可能
>>> 
>>> print(w.translate(str.maketrans('ow', 'ZW', 'n')))
Ze tWZ Ze tWZ Ze tWZ
```

``` 
>>> # 以下の場合、第一・第二引数の文字列の長さは一致が必要
>>> # 置換先文字列に長さ2つ以上文字列は指定不可
>>> 
>>> print(w.translate(str.maketrans('ow', 'ZZW', 'n')))
Traceback (most recent call last):
  File "<pyshell#88>", line 1, in <module>
    print(w.translate(str.maketrans('ow', 'ZZW', 'n')))
ValueError: the first two maketrans arguments must have equal length
```
###■ 位置指定による置換・挿入： slice
&emsp;The replacement and insertion by tab control specification：slice

```
>>> # スライスによる分割により任意の文字列と連結
>>> # →指定位置が置換された新たな文字列が作成できる

>>> w = "'abcdefghijklmn'"
>>> 
>>> print(w[:5] + "XXX" + w[8:])
'abcdXXXhijklmn'

```

```
>>> # 文字列に別の文字列を連結しているだけ
>>> # → 文字数の一致は不要
>>> 
>>> print(w[:5] + '-' + w[8:])
'abcd-hijklmn'
```

```
>>> # 任意の位置に別の文字列を挿入し、新たな文字列の作成も可能
>>> 
>>> print(s[:5] + '*******' + s[5:])
Traceback (most recent call last):
  File "<pyshell#90>", line 1, in <module>
    print(s[:5] + '*******' + s[5:])
NameError: name 's' is not defined
>>> print(w[:5] + '*******' + w[5:])
'abcd*******efghijklmn'
```

随時に更新していきますので、<br>定期的な購読をよろしくお願いします。
I'll update my article at all times.
So, please subscribe my articles from now on.

本記事について、<br>何か要望等ありましたら、気軽にメッセージをください！
If you have some requests, please leave some messages! by You-Tarin

また、「Qiita」へ投稿した内容は、随時ブログへ移動して行きたいと思いますので、よろしくお願いします。