今回は、Pythonでランダムな文字列を生成する方法について紹介します。
その名前が示すように、ランダムな文字列を生成する必要があるので、 random モジュールが適しています。
ここでは様々なアプローチがあるので、最も直感的なものから始めましょう。
ランダムな整数を使います。
ランダムな整数列から文字列を生成する
ご存知のように、chr(integer) は整数を ASCII の制限内にあると仮定して文字にマッピングします。
このマッピングを使って、chr(x) を使って任意の整数を ASCII 文字レベルにスケーリングすることができます。
import random
# The limit for the extended ASCII Character setMAX_LIMIT = 255
random_string = ''
for _ in range(10):
random_integer = random.randint(0, MAX_LIMIT)
# Keep appending random characters using chr(x)
random_string += (chr(random_integer))
print(random_string, len(random_string))
|
出力例
ð|ÒR: Rè 10
|
ここでは、文字列の長さは10文字のように見えますが、改行やスペースなどとともに奇妙な文字が得られます。
これは、ASCII文字セット全体を考慮したためです。
英語のアルファベットだけを扱いたい場合は、そのASCII値を使用すればよい。
import random
random_string = ''
for _ in range(10):
# Considering only upper and lowercase letters
random_integer = random.randint(97, 97 + 26 - 1)
flip_bit = random.randint(0, 1)
# Convert to lowercase if the flip bit is on
random_integer = random_integer - 32 if flip_bit == 1 else random_integer
# Keep appending random characters using chr(x)
random_string += (chr(random_integer))
print(random_string, len(random_string))
|
出力例
wxnhvYDuKm 10
|
見ての通り、今は大文字と小文字しかありません。
しかし、このような面倒なことをしなくても、Pythonに仕事をさせることができます。
Pythonはまさにこの目的のために string モジュールを提供してくれているのです。
では、たった2行のコードで同じことができるのか見てみましょう。
Python で string モジュールを使ってランダムな文字列を生成する
Pythonの文字列で使われる文字のリストはここで定義されており、これらの文字のグループから選ぶことができます。
そこで、先ほどのように整数を使うのではなく、 random.choice() メソッドを使ってランダムに文字を選ぶことにします。
この作業をすべて行ってくれる関数 random_string_generator() を定義してみましょう。
これは、文字列の長さと、サンプルとして許可される文字のセットが与えられると、ランダムな文字列を生成します。
import random
import string
def random_string_generator(str_size, allowed_chars):
return ''.join(random.choice(allowed_chars) for x in range(str_size))
chars = string.ascii_letters + string.punctuation
size = 12
print(chars)
print('Random String of length 12 =', random_string_generator(size, chars))
|
ここでは、許容される文字のリストを string.ascii_letters (大文字と小文字) と string.punctuation (すべての句読点) として指定しました。
これで、メイン関数が2行になり、 random.choice(set) を使ってランダムに文字を選択することができるようになりました。
サンプル出力
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
Random String of length 12 = d[$Om{;#cjue
|
確かにランダムな文字列が生成されました。
乱数生成の安全性を高める
上記のランダム生成方法は有効であるが、より暗号的に安全な関数にしたい場合は、 random.SystemRandom() 関数を使用することです。
以下にランダム生成関数の例を示す。
import random
import string
output_string = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(10))
print(output_string)
|
結果は以下の通りです。
出力
iNsuInwmS8 |
これにより、文字列の生成は暗号学的に安全であることが保証されます。
ランダムUUID生成
ランダムなUUID文字列を生成したい場合、uuidモジュールが役に立ちます。
import uuid
# Generate a random UUIDprint('Generated a random UUID from uuid1():', uuid.uuid1())
print('Generated a random UUID from uuid4():', uuid.uuid4())
|
出力例
Generated a random UUID from uuid1(): af5d2f80-6470-11ea-b6cd-a73d7e4e7bfe
Generated a random UUID from uuid4(): 5d365f9b-14c1-49e7-ad64-328b61c0d8a7
|
まとめ
この記事では、 random と string モジュールを使って Python でランダムな文字列を生成する方法を学びました。