Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python入門】正規表現を使って数値を検証する方法を具体例付きで解説

Pythonの標準ライブラリであるreモジュールと正規表現を組み合わせれば、「文字列が期待どおりの数値パターンになっているか」を簡単に検証できます。ここでは、代表的な2つのケース――特定の数値との完全一致、および5桁の正の整数の判定――について、実際に動作するコード例とともに解説します。

例1:特定の数値「2018」と完全一致するか検証する

次のコードは、文字列が数値「2018」とちょうど一致しているかどうかを確認します。\bは単語境界を表すメタ文字で、文字列全体が「2018」であることを保証する役割を果たします。

import re

s = '2018'
match = re.match(r'\b2018\b', s)
print(match.group())

実行結果

2018

文字列が「2018」以外の場合はmatch.group()でエラーになるため、実際にはif match:でマッチの有無を確認してから処理するのが安全です。

例2:5桁の正の整数を検証する

次のコードは、任意の5桁の正の整数かどうかを検証します。ポイントは以下の3つです。

  • (?<!-):否定後読み(ネガティブ・ルックビハインド)と呼ばれる構文で、対象の直前にマイナス記号がないこと(=負の数ではないこと)を確認します。
  • [1-9]\d{4}:先頭が0でない1〜9の数字1桁+続く4桁の数字、つまり合計5桁の整数を表します。
  • \b:前後に余計な文字が付いていないことを保証します。
import re

s = '2346'  # 4桁なのでマッチしない
match = re.match(r'(?<!-)\b[1-9]\d{4}\b', s)
print(match)

s2 = '56789'  # 5桁なのでマッチする
match = re.match(r'(?<!-)\b[1-9]\d{4}\b', s2)
print(match.group())

実行結果

None
56789

4桁の「2346」にはマッチせずNoneが返り、5桁の「56789」には正常にマッチして56789が出力されます。このように、正規表現のパターンを少し変えるだけで、桁数や符号の条件を柔軟に制御できます。

押さえておきたい基本構文まとめ

  • re.match(パターン, 文字列):文字列の先頭からパターンとの一致を試みる関数。不一致の場合はNoneを返します。
  • \b:単語の境界(英数字・アンダースコアとそれ以外の境目)に一致します。
  • [1-9]:指定した範囲内の1文字に一致する文字クラスです。
  • \d{4}:数字1桁(\d)がちょうど4回繰り返されることを意味します。
  • (?<!...):直前に指定パターンが「存在しない」場合のみマッチさせる否定後読みです。

これらを組み合わせることで、郵便番号・電話番号・IDなど、さまざまな形式の入力値検証(バリデーション)にも応用できます。まずは小さなパターンから試して、動きを確かめながら学んでいくのがおすすめです。

  1. Pythonの正規表現を使って文字列から数字のみを抽出・マッチングする方法

    Pythonでは、標準ライブラリの re モジュールを使うことで、正規表現によるパターンマッチングが簡単に行えます。文字列から「数字のみ」を取り出したい場合は、メタ文字 \d(任意の1桁の数字に一致)を使用します。ここでは、代表的な2つの方法——re.search() と re.findall() を使った例を紹介します。なお、コードはPython 3系の記法に準拠しています。例1:re.search() で最初に見つかった数字の並びを取得する次のコードは、指定した文字列の中から最初に出現する連続した数字(1桁以上)を検索し、マッチオブジェクトとして返します。import re m = re

  2. 【Python】正規表現を使って文字列内の単語をマッチ・抽出する方法

    次のコードは、指定された文字列の中から「meeting」という単語を抽出します。ここでは肯定の先読み(look-ahead)と肯定の後読み(look-behind)アサーションを使用しています。これにより、単語を囲む文字の存在を条件として考慮しつつ、その文字自体はマッチ結果に含めないようにできます。コード例import re s = https://www.google.com/meeting_agenda_minutes.html result = re.findall(r(?<=[\W_])meeting(?=[\W_]), s) print(result)出力[meeting]パ