[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.

このコードでは、すべての apple1 に置換されています。

例:特定の記号を数字に置換

特定の記号を数字に置換する例です。

ここでは #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の範囲の乱数に置換されています。

よくある質問

re.sub()で数字以外も置換されてしまうのはなぜ?

re.sub()で数字以外の文字も置換されてしまうのは、指定した正規表現パターンが意図した範囲を超えてマッチしているためです。

例えば、\d+というパターンを使用すると、1つ以上の数字にマッチしますが、他の文字列がそのパターンに含まれている場合、意図しない部分も置換されることがあります。

正確に置換したい部分を指定するためには、より具体的な正規表現を使用することが重要です。

正規表現で特定の数字だけを置換するにはどうすればいい?

特定の数字だけを置換するには、正規表現パターンを工夫する必要があります。

例えば、特定の桁数や範囲を指定することで、置換対象を絞り込むことができます。

例えば、4桁の数字だけを置換したい場合は、\b\d{4}\bというパターンを使用します。

このように、数字の前後に境界を指定することで、特定の数字だけを正確に置換することが可能です。

re.sub()で置換後の文字列が意図したものと異なる場合の対処法は?

re.sub()で置換後の文字列が意図したものと異なる場合、以下の点を確認すると良いでしょう:

  • 正規表現パターンの確認: 使用している正規表現が正しいか、意図した部分にマッチしているかを確認します。
  • 置換文字列の確認: 置換後の文字列が正しく設定されているかを確認します。
  • デバッグ: re.sub()を実行する前に、re.findall()を使ってマッチする部分を確認し、どの部分が置換されるかを把握します。

これらの確認を行うことで、意図した通りの置換ができるようになります。

まとめ

この記事では、Pythonの正規表現を使用して数字を置換する方法について詳しく解説しました。

特に、re.sub()を使った数字の置換や、特定の条件に基づく応用例を通じて、実際のプログラミングに役立つテクニックを紹介しました。

これらの知識を活用して、実際のプロジェクトや日常のプログラミング作業において、正規表現を効果的に利用してみてください。

  • URLをコピーしました!
目次から探す