テストデータの作成や、一時的なセッションIDの発行など、プログラム内で「ランダムな文字列」を生成したい場面は多岐にわたります。
Pythonでは、標準ライブラリの random モジュールと、文字種定義を持つ string モジュールを組み合わせることで、指定した長さや文字種のランダム文字列を容易に生成できます。ここでは、定数の種類と実装コードについて解説します。
stringモジュールの定数一覧
ランダム生成の「素材」となる文字セットは、string モジュールにあらかじめ定義されています。手動で "abcdef..." と書く必要はなく、以下の定数を利用するのが一般的です。
| 属性名 (stringモジュール) | 内容 (文字セット) | 説明 |
string.ascii_letters | a-z および A-Z | アルファベット全文字(大小区別あり) |
string.ascii_lowercase | a-z | アルファベット小文字のみ |
string.ascii_uppercase | A-Z | アルファベット大文字のみ |
string.digits | 0-9 | 数字のみ |
string.punctuation | !”#$%&… | 記号のみ |
実装例:一時的なアクセストークンの生成
以下のコードは、random.choices を使用して、指定された長さのランダムな文字列を生成する関数です。英字のみのパターンと、英数字を混在させたパターンの2通りを実装しています。
import random
import string
def generate_random_string(length, char_type="alphanumeric"):
"""
指定された長さと文字種でランダムな文字列を生成する
"""
if char_type == "alpha":
# 英字のみ (a-z, A-Z)
source_chars = string.ascii_letters
elif char_type == "alphanumeric":
# 英字 + 数字 (a-z, A-Z, 0-9)
source_chars = string.ascii_letters + string.digits
else:
# デフォルトなど
source_chars = string.ascii_letters + string.digits
# 1. random.choicesでリストとしてランダムに文字を取得
# k=length で取得する文字数を指定します
random_list = random.choices(source_chars, k=length)
# 2. リストを結合して1つの文字列にする
return "".join(random_list)
def main():
# ケース1: 英字のみのランダム文字列 (5文字)
# 用途例: 簡易的な識別コード
token_alpha = generate_random_string(5, "alpha")
print(f"英字のみ(5文字): {token_alpha}")
# ケース2: 英数字混在のランダム文字列 (12文字)
# 用途例: セッションIDや一時パスワード
token_alphanum = generate_random_string(12, "alphanumeric")
print(f"英数字混在(12文字): {token_alphanum}")
if __name__ == "__main__":
main()
コードの解説
random.choices(population, k=N)
Python 3.6から追加されたメソッドです。指定されたシーケンス(population)から、重複ありでランダムに k 個の要素を選び出し、リストとして返します。
“”.join(…)
random.choices の戻り値は [‘a’, ‘B’, ‘c’] のようなリスト形式であるため、join メソッドを使って空文字 “” で結合し、単一の文字列 aBc に変換しています。
注意点
random モジュールは疑似乱数生成器であり、暗号学的に安全ではありません。本格的なパスワード生成やセキュリティに関わるトークン生成には、Python 3.6以降で標準搭載された secrets モジュールの使用を検討してください。
