No.035 [Python] 문자열 교체 ②

4482 단어 Pythonprogramming

1초에 한 번씩 '문자열 바꾸기' 를 써라.


I'll write continuousy about the replacement of strings in python"on this page.

■ 정규 표현식 교체:re.sub / re.subn


 The replacement by Regular expression:re.sub, re.subn
>>> # 置換元文字列と完全一致の場合、置換される(replace()・translate()関数)
>>> # 完全一致出ない置換の場合は、reモジュール sub()関数を利用する
>>> 
>>> import re
>>> 
>>> w = '[email protected] [email protected] [email protected]'
>>> 
>>> print(re.sub("[a-z]*@", "ABC@", w))
[email protected] [email protected] [email protected]
>>> 
>>> 
>>> # replace()同様、第四引数(count)に最大置換回数の指定が可能
>>> 
>>> print(re.sub('[a-z]*@', 'ABC@', w, 2))
[email protected] [email protected] [email protected]
>>> # 複数の文字列を同文字列へ置換
>>> 
>>> import re
>>> 
>>> w = '[email protected] [email protected] [email protected]'
>>> 
>>> print(re.sub("[xyz]", "1", w))
[email protected] [email protected] [email protected]
>>> # ↑複数の異なる文字を同じ文字列に置換する場合に利用する
>>> # |で区切るといずれかのパターンにマッチする
>>> # 正規表現の特殊文字利用も可、文字列をそのまま指定しても可能
>>> # 複数の異なる文字列を同じ文字列に置換する場合に利用する
>>> 
>>> import re
>>> 
>>> w = '[email protected] [email protected] [email protected]'
>>> 
>>> print(re.sub('aaa|bbb|ccc', 'ABC', w))
[email protected] [email protected] [email protected]
>>> # 一致箇所を使った置換
>>> # パターンの一部を()で囲む:()内の一致する文字列を利用することが可能
>>> 
>>> print(re.sub('([a-z]*)@', '\\1-123@', w))
[email protected] [email protected] [email protected]
>>> 
>>> 
>>> print(re.sub('([a-z]*)@', r'\1-123@', w))
[email protected] [email protected] [email protected]
>>> 
>>> 
>>> # ↑ \1 が()に一致した箇所に対応。()が吹く風の場合は \2,\3とする
>>> # ↑ '',””で囲まれた文字列は、\\1の様に\をエスケープすることが必要
>>> # ↑ r""の様に先頭にrをつけるraw文字列の場合、\1で問題ない
>>> # 置換箇所の個数取得
>>> # 置換された文字列と置換部分の個数とタプルを返す

>>> t = re.subn('[a-z]*@', 'ABC@', w)
>>> 
>>> print(t)
('[email protected] [email protected] [email protected]', 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

■ 지정된 위치로 교체, 삽입:슬라이스


 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'
수시로 업데이트되므로 정기적으로 구독해주세요.
I'll update my article at all times.
So, please subscribe my articles from now on.
본 보도에 관하여 만약 무슨 요구가 있으면 마음대로 메시지를 남겨 주십시오!
If you have some requests, please leave some messages! by You-Tarin
또한 Qita에 투고한 내용은 언제든지 블로그에 가고 싶으니 잘 부탁드립니다.

좋은 웹페이지 즐겨찾기