Pythonで文字列が半角英数字であるかを正規表現でチェックする

半角英数字を正規表現でチェックするには^[a-zA-Z0-9]+$を使用します。この正規表現は「1文字以上の半角英数字で構成される文字列」という意味を持ち、3DModel などの文字列にマッチします。

さらに、固定長の半角英数字を指定したい場合は^[a-zA-Z0-9]{n}$、例えば6桁の場合は^[a-zA-Z0-9]{6}$を使用します。同様に、最小桁数や最大桁数を指定することで柔軟なパターンを構築できます。例えば、12桁以上20桁以下に制限したい場合は^[a-zA-Z0-9]{12,20}$が有効です。

以下によく利用される正規表現パターンをまとめました。用途に応じてご活用ください。

#マッチ条件正規表現パターン
1すべて半角英数字^[a-zA-Z0-9]+$
2固定長 n桁の半角英数字^[a-zA-Z0-9]{n}$
3n桁以上の半角英数字^[a-zA-Z0-9]{n,}$
4m桁以下の半角英数字^[a-zA-Z0-9]{1,m}$
5n桁以上m桁以下の半角英数字^[a-zA-Z0-9]{n,m}$
正規表現のパターン一覧と条件

ソースコード

次に、入力された文字列が半角英数字のみで構成されているかを判定するPython関数を紹介します。この関数では、以下の条件に応じて検証が可能です。

  • 最小桁数を省略した場合: 文字列が指定された最大桁数以内で、半角英数字のみで構成されていることを確認します。
  • 最大桁数を省略した場合: 文字列が指定された最小桁数以上で、半角英数字のみで構成されていることを確認します。
  • 最小桁数・最大桁数を省略した場合: 文字列全体が、半角英数字のみで構成されていることを確認します。
import re

def validate_args_type(string, min_length, max_length):
    """引数の型を検証します"""
    if not isinstance(string, str):
        raise TypeError("文字列 (string) は str 型である必要があります。")

    if min_length is not None and not isinstance(min_length, int):
        raise TypeError("最小桁数 (min_length) は int 型である必要があります。")

    if max_length is not None and not isinstance(max_length, int):
        raise TypeError("最大桁数 (max_length) は int 型である必要があります。")

def is_alphanumeric(string, min_length=None, max_length=None):
    """
    文字列が半角英数字のみで構成されるかをチェックします。

    Args:
        string (str): 入力文字列
        min_length (int or None): 最小桁数 (Noneの場合は1として扱います)
        max_length (int or None): 最大桁数 (Noneの場合は文字列の長さを最大値として扱います)

    Returns:
        bool: 入力文字列が条件を満たす場合はTrue、それ以外はFalseを返します。
    """
    # 引数の型検証
    validate_args_type(string, min_length, max_length)

    # デフォルト値の設定
    min_len = min_length or 1
    max_len = max_length or len(string)

    # 最小値・最大値の整合性チェック
    if min_len < 1:
        raise ValueError("最小桁数 (min_length) は1以上の整数である必要があります。")

    if max_length is not None and max_len < min_len:
        raise ValueError("最大桁数 (max_length) は最小桁数以上である必要があります。")

    # 正規表現パターンを構築
    if max_length is None:
        pattern = re.compile(f"^[a-zA-Z0-9]{{{min_len},}}$")
    else:
        pattern = re.compile(f"^[a-zA-Z0-9]{{{min_len},{max_len}}}$")

    # 正規表現によるチェック
    return bool(pattern.match(string))

テストケース

# True: 条件を満たす
print(is_alphanumeric("hello123", min_length=3, max_length=10))

# False: 最小桁数未満
print(is_alphanumeric("hello123", min_length=10))

# False: 半角英数字以外を含む
print(is_alphanumeric("hello!123", min_length=1))

# False: 最大桁数を超える
print(is_alphanumeric("abc", max_length=2))

# True: 半角英数字のみ、条件を満たす
print(is_alphanumeric("ABC123", min_length=1, max_length=6))

# False: 空文字は条件を満たさない
print(is_alphanumeric("", min_length=1))

Follow me!

photo by:Rubaitul Azad