[Python] 正規表現で数字のみ置換する方法
Pythonで正規表現を使用して数字のみを置換するには、re
モジュールのre.sub()関数
を使います。
正規表現パターンとして\d
を使用すると、数字にマッチします。
例えば、文字列内のすべての数字を*
に置換する場合、re.sub(r'\d', '*',文字列)
とします。
\d+
を使うと、連続する数字全体を一度に置換できます。
- 正規表現を使った数字の置換方法
- re.sub()の基本的な使い方
- 特定の条件での数字の置換例
- 文字列の特定パターンを数字に置換
- ランダムな数字への置換方法
数字を正規表現で扱う方法
数字にマッチする正規表現パターン
\dの意味と使い方
正規表現における\d
は、任意の数字(0から9)にマッチする特殊な文字クラスです。
これを使うことで、文字列の中から数字を簡単に抽出することができます。
import re
text = "今日は2023年10月5日です。"
pattern = r"\d"
# 数字にマッチする部分を全て抽出
matches = re.findall(pattern, text)
print(matches)
['2', '0', '2', '3', '1', '0', '5']
このコードでは、文字列中のすべての数字をリストとして取得しています。
\d+で連続する数字にマッチ
\d+
は、1つ以上の連続した数字にマッチします。
これを使うことで、例えば年や日付などの連続した数字を一度に取得することができます。
import re
text = "2023年10月5日"
pattern = r"\d+"
# 連続する数字にマッチ
matches = re.findall(pattern, text)
print(matches)
['2023', '10', '5']
このコードでは、連続した数字をすべて抽出し、リストとして表示しています。
数字以外の文字を無視する方法
非数字にマッチしないパターン
数字以外の文字を無視したい場合は、[^0-9]
を使用します。
これにより、数字以外の文字を除外することができます。
import re
text = "abc123def456"
pattern = r"[0-9]+"
# 数字にマッチする部分を抽出
matches = re.findall(pattern, text)
print(matches)
['123', '456']
このコードでは、数字のみを抽出し、非数字の部分は無視されています。
特定の範囲の数字にマッチする方法
特定の範囲の数字にマッチさせたい場合は、[0-9]
のように範囲を指定することができます。
例えば、1桁の数字や2桁の数字を抽出することが可能です。
import re
text = "1, 23, 456, 7890"
pattern = r"[0-9]{1,2}" # 1桁または2桁の数字にマッチ
# 特定の範囲の数字にマッチ
matches = re.findall(pattern, text)
print(matches)
['1', '23', '45', '6', '78', '90']
このコードでは、1桁または2桁の数字のみを抽出しています。ただし、3桁以上の数字でも最初の二桁とマッチしてしまうため、1~2桁のみに限定する場合は、数値のリストに変換してからlog10関数を使ってフィルタリングする方法が簡単です。
re.sub()を使った数字の置換
re.sub()の基本的な使い方
re.sub()
は、正規表現にマッチした部分を指定した文字列に置換するための関数です。
基本的な構文は以下の通りです。
re.sub(pattern, replacement, string, count=0, flags=0)
pattern
: 置換対象の正規表現パターンreplacement
: 置換後の文字列string
: 対象の文字列count
: 置換する回数(デフォルトは0で全て置換)flags
: 正規表現のオプション
以下の例では、数字を*
に置換しています。
数字を特定の文字に置換する方法
例:数字を*に置換
数字を*
に置換する例を見てみましょう。
import re
text = "私の電話番号は123-456-7890です。"
pattern = r"\d+" # 1つ以上の数字にマッチ
# 数字を*に置換
result = re.sub(pattern, "*", text)
print(result)
私の電話番号は*-*-*です。
このコードでは、すべての数字が*
に置換されています。
例:数字を#に置換
次に、数字を#
に置換する例です。
import re
text = "2023年10月5日、私の誕生日です。"
pattern = r"\d+" # 1つ以上の数字にマッチ
# 数字を#に置換
result = re.sub(pattern, "#", text)
print(result)
#年#月#日、私の誕生日です。
このコードでは、すべての数字が#
に置換されています。
連続する数字をまとめて置換する方法
例:電話番号の一部を置換
電話番号の一部を特定の文字に置換する例です。
import re
text = "私の電話番号は123-456-7890です。"
pattern = r"(\d{3})-(\d{3})-(\d{4})" # 電話番号のパターン
# 電話番号の一部を*に置換
result = re.sub(pattern, "***-***-****", text)
print(result)
私の電話番号は***-***-****です。
このコードでは、電話番号の形式を保持しつつ、数字部分を*
に置換しています。
例:日付の数字を置換
日付の数字を特定の文字に置換する例です。
import re
text = "今日は2023年10月5日です。"
pattern = r"(\d{4})年(\d{1,2})月(\d{1,2})日" # 日付のパターン
# 日付の数字を#に置換
result = re.sub(pattern, "#年#月#日", text)
print(result)
今日は#年#月#日です。
このコードでは、日付の数字部分を#
に置換しています。
応用例:特定の条件で数字を置換
特定の桁数の数字のみを置換する
例:4桁の数字を置換
4桁の数字のみを置換する例を見てみましょう。
import re
text = "私のIDは1234です。次のIDは5678です。"
pattern = r"\d{4}" # 4桁の数字にマッチ
# 4桁の数字を*に置換
result = re.sub(pattern, "*", text)
print(result)
私のIDは*です。次のIDは*です。
このコードでは、4桁の数字が*
に置換されています。
例:2桁の数字を置換
次に、2桁の数字のみを置換する例です。
import re
text = "私の年齢は25歳で、友達は30歳です。"
pattern = r"\d{2}" # 2桁の数字にマッチ
# 2桁の数字を#に置換
result = re.sub(pattern, "#", text)
print(result)
私の年齢は#歳で、友達は#歳です。
このコードでは、2桁の数字が#
に置換されています。
数字の前後に特定の文字がある場合のみ置換
例:数字の前に $ がある場合
数字の前に $
がある場合のみ置換する例です。
import re
text = "商品の価格は$100です。"
pattern = r"\$(\d+)" # $の後に続く数字にマッチ
# $の後の数字を*に置換
result = re.sub(pattern, "$*", text)
print(result)
商品の価格は$*です。
このコードでは、$
の後に続く数字が*
に置換されています。
例:数字の後に「円」がある場合
数字の後に「円」がある場合のみ置換する例です。
import re
text = "商品の価格は100円です。"
pattern = r"(\d+)円" # 数字の後に円が続くパターン
# 数字の後の円を#に置換
result = re.sub(pattern, "#円", text)
print(result)
商品の価格は#円です。
このコードでは、数字の後に「円」がある場合、その数字が#
に置換されています。
数字の範囲を指定して置換する
例:100以上の数字を置換
100以上の数字を置換する例です。
import re
text = "テストの点数は95点、100点、105点です。"
pattern = r"(1[0-9]{2}|[2-9][0-9]{2,})" # 100以上の数字にマッチ
# 100以上の数字を*に置換
result = re.sub(pattern, "*", text)
print(result)
テストの点数は95点、*点、*点です。
このコードでは、100以上の数字が*
に置換されています。
例:0から9までの数字を置換
0から9までの数字を置換する例です。
import re
text = "数字は0から9まであります。"
pattern = r"[0-9]" # 0から9までの数字にマッチ
# 0から9までの数字を#に置換
result = re.sub(pattern, "#", text)
print(result)
数字は#から#まであります。
このコードでは、0から9までの数字が#
に置換されています。
応用例:文字列の一部を数字に置換
文字列の中の特定のパターンを数字に置換
例:特定の単語を数字に置換
特定の単語を数字に置換する例を見てみましょう。
ここでは apple
という単語を 1
に置換します。
import re
text = "I have an apple and another apple."
pattern = r"apple" # 置換対象の単語
# "apple"を1に置換
result = re.sub(pattern, "1", text)
print(result)
I have an 1 and another 1.
このコードでは、すべての apple
が 1
に置換されています。
例:特定の記号を数字に置換
特定の記号を数字に置換する例です。
ここでは #
を 2
に置換します。
import re
text = "この文には#が含まれています。#は特別な記号です。"
pattern = r"#" # 置換対象の記号
# "#"を2に置換
result = re.sub(pattern, "2", text)
print(result)
この文には2が含まれています。2は特別な記号です。
このコードでは、すべての #
が 2
に置換されています。
数字をランダムな値に置換する
例:乱数を使った置換
文字列中の数字を乱数に置換する例です。
ここでは、数字を0から9の乱数に置換します。
import re
import random
text = "私の番号は123です。次の番号は456です。"
pattern = r"\d+" # 1つ以上の数字にマッチ
# 数字を乱数に置換する関数
def replace_with_random(match):
return str(random.randint(0, 9))
# 数字を乱数に置換
result = re.sub(pattern, replace_with_random, text)
print(result)
私の番号は7です。次の番号は3です。
このコードでは、元の数字が0から9の乱数に置換されています。
例:特定の範囲内でランダムな数字に置換
特定の範囲内でランダムな数字に置換する例です。
ここでは、1から100の範囲で乱数に置換します。
import re
import random
text = "テストの点数は85点、90点、95点です。"
pattern = r"\d+" # 1つ以上の数字にマッチ
# 数字を1から100の乱数に置換する関数
def replace_with_random_range(match):
return str(random.randint(1, 100))
# 数字を1から100の乱数に置換
result = re.sub(pattern, replace_with_random_range, text)
print(result)
テストの点数は42点、67点、88点です。
このコードでは、元の数字が1から100の範囲の乱数に置換されています。
よくある質問
まとめ
この記事では、Pythonの正規表現を使用して数字を置換する方法について詳しく解説しました。
特に、re.sub()
を使った数字の置換や、特定の条件に基づく応用例を通じて、実際のプログラミングに役立つテクニックを紹介しました。
これらの知識を活用して、実際のプロジェクトや日常のプログラミング作業において、正規表現を効果的に利用してみてください。