3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonAdvent Calendar 2023

Day 22

replace/re.subで文字列変換

Last updated at Posted at 2023-12-24

はじめに

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で回数関係なくすべて変換する。

基本

patternreplを正規表現で表す場合は 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のどれか)
() グループ化

戻る

以上

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?