はじめに
Pythonの文字列変換について、replaceとre.subについてまとめる。
目次
replace
replace(old, new, count=0)
old
からnew
へ変換する。count
は変換する最大回数。初期値は0で回数関係なくすべて変換する。
replace_sample.py
# 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,...(数値がグループの順番)
で指定する。
resub_sample.py
# 数値を_に変換。正規表現を使う場合は 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
を使うと便利。
resub_sample.py
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
に等しい。
resub_sample.py
# 変換関数
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のどれか) |
() | グループ化 |
以上