はじめに
Pythonの文字列変換について、replaceとre.subについてまとめる。
目次
replace
replace(old, new, count=0)
oldからnewへ変換する。countは変換する最大回数。初期値は0で回数関係なくすべて変換する。
# ABCを___に変換
s = 'ABCDEFABCDEF'
s = s.replace('ABC','___',)
print(f'# {s=}')
# s='___DEF___DEF'
# count=1で1回変換
s = 'ABCDEFABCDEF'
s = s.replace('ABC','___',1)
print(f'# {s=}')
# s='___DEFABCDEF'
re.sub
正規表現を使用して変換する方法。reモジュールをimportして使用する。
re.sub(pattern, repl, string, count=0, flags=0)
stringが変換対象の文字列で、patternに合致したものをreplへ変換する。countは変換する最大回数。初期値は0で回数関係なくすべて変換する。
基本
patternとreplを正規表現で表す場合は rを付ける。patternを()で括るとグループ化される。グループ化されたパターンをreplで再利用する場合は\1,\2,...(数値がグループの順番)で指定する。
# 数値を_に変換。正規表現を使う場合は r を付ける
s = 'ABCabc123@python.com'
s = re.sub(r'\d', '_', s)
print(f'#{s=}')
#s='ABCabc___@python.com'
# グループの一つ目を抜き出す。
s = 'ABCabc123@python.com'
s = re.sub(r'(.*)(@)(.*)', r'\1', s)
print(f'#{s=}')
#s='ABCabc123'
flags
flagsを使うと、検索パターンを拡張できる。
| flags | 内容 |
|---|---|
| re.ASCII | ASCII文字だけマッチ。 |
| re.DOTALL | . を改行を含む任意の文字にマッチ。 |
| re.IGNORECASE | 大文字小文字を区別しないマッチ。 |
| re.MULTILINE | 複数行文字列に対して、^ と $ を各行でマッチ。 |
複数行の^先頭、$終端一致の場合は、re.MULTILINEを使うと便利。
s = 'ABCabc123@python.com\nABCabc123@python.com\nABCabc123@python.com\n'
s = re.sub(r'^ABC', '___', s)
print(s)
# ___abc123@python.com
# ABCabc123@python.com
# ABCabc123@python.com
# re.MULTILINEを有効にする
s = 'ABCabc123@python.com\nABCabc123@python.com\nABCabc123@python.com\n'
s = re.sub(r'^ABC', '___', s, flags=re.MULTILINE)
print(s)
# ___abc123@python.com
# ___abc123@python.com
# ___abc123@python.com
応用
複雑な変換をしたい場合replを関数化することもできる。group(1)は\1に等しい。
# 変換関数
def converter_func(match):
print(f'# {match=}')
print(f'# {match.group(0)=}')
print(f'# {match.group(1)=}')
print(f'# {match.group(2)=}')
print(f'# {match.group(3)=}')
ret = f'# User:{match.group(1)} / Domain:{match.group(3)}'
return ret
s = 'ABCabc123@python.com'
s = re.sub(r'(.*)(@)(.*)', converter_func, s)
print(s)
# match=<re.Match object; span=(0, 20), match='ABCabc123@python.com'>
# match.group(0)='ABCabc123@python.com'
# match.group(1)='ABCabc123'
# match.group(2)='@'
# match.group(3)='python.com'
# User:ABCabc123 / Domain:python.com
正規表現
正規表現一覧。
| 正規表現 | 内容 |
|---|---|
| \d | 任意の数字 |
| \D | 任意の数字以外 |
| \s | 任意の空白文字 |
| \S | 任意の空白文字以外 |
| \w | 任意の英数字 |
| \W | 任意の英数字以外 |
| . | 任意の一文字 |
| ^ | 文字列の先頭 ^abc (abcで始まる) |
| $ | 文字列の末尾 abc$ (abcで終わる) |
| * | 0回以上の繰り返し |
| + | 1回以上の繰り返し |
| ? | 0回または1回 |
| {m} | m回の繰り返し |
| {m,n} | m〜n回の繰り返し |
| | | or |
| [] | or [abcdef] (a,b,c,d,e,fのどれか) |
| () | グループ化 |
以上