2

Pythonを使用して小文字と大文字と数字を含むパスワードを生成したいのですが、これら3種類すべてが使用されていることを保証する必要があります。ここまで書いてきましたが、3種類全てのキャラクターが使用されていることを保証するものではありません。8文字を2分割したい。最初の 3 と最後の 5。最初の部分で 3 種類の文字すべてが使用されていることを確認してから、次の部分でそれらをシャッフルしますが、それをコーディングする方法がわかりません。

import random
a = 0
password = ''
while a < 8:
    if random.randint(0, 61) < 10:
        password += chr(random.randint(48, 57))
    elif 10<random.randint(0, 61)<36:
        password += chr(random.randint(65, 90))
    else:
        password += chr(random.randint(97, 122))
    a += 1
print(password)
4

3 に答える 3

3

あなたが言ったように:最初の3つの位置はそれぞれ大文字と小文字と数字からランダムに選択され、残りはすべての文字からランダムに選択され、シャッフルされます。

from random import choice, shuffle
from string import ascii_uppercase, ascii_lowercase, digits
pwd = [choice(ascii_lowercase), choice(ascii_uppercase), choice(digits)] \
      + [choice(ascii_lowercase + ascii_uppercase + digits) for _ in range(5)]
shuffle(pwd)
pwd = ''.join(pwd)

この方法では、使用可能なすべての文字の大部分からランダムに選択されるため、数字が少し「過小評価」される可能性があることに注意してください。そのため、最初の 3 つ以降の文字が数字になる可能性は 10/62 です。文字の 1/3 を数字にしたい場合 (これは良い考えではないかもしれません。以下を参照してください)、最初にランダムに 1 つの文字グループを選択し、それぞれ 1/3 の確率で、次に文字をそのグループから形成します。

pwd = [choice(ascii_lowercase), choice(ascii_uppercase), choice(digits)] \
      + [choice(choice([ascii_lowercase, ascii_uppercase, digits])) for _ in range(5)]

ただし、これによりランダム性が低下し、パスワードのセキュリティが低下することに注意してください。ただし、3 つのグループのそれぞれに少なくとも 1 つのグループが必要であるという要件も同様です。

于 2016-07-06T12:42:38.040 に答える
0

あなたの質問は 3 つの部分で構成されています。

  1. 8 文字を 2 つの部分に分割 - 最初の 3 つと最後の 5 つ - (文字列スライス)
  2. 最初の部分で 3 種類の文字がすべて使用されていることを確認します (パスワードの検証)。
  3. 文字をシャッフルする (文字列をシャッフルする)

Part1:文字列をスライスする

これは、 Pythonを使用して文字列をスライスする方法を教える良いチュートリアルです..

あなたの場合、これをコードの最後に挿入すると...

print(password[:3])
print(password[3:])

...最初の 3 文字と最後の 5 文字が表示されます。


パート 2:パスワードの検証

良い答えはここにあります。

def password_check(password):
    # calculating the length
    length_error = len(password) < 8

    # searching for digits
    digit_error = re.search(r"\d", password) is None

    # searching for uppercase
    uppercase_error = re.search(r"[A-Z]", password) is None

    # searching for lowercase
    lowercase_error = re.search(r"[a-z]", password) is None

     # overall result
    password_ok = not ( length_error or digit_error or uppercase_error or lowercase_error)

    return password_ok

password_check(password) 

この関数はTrue、すべての条件を満たしている場合に戻り、そうでFalseない場合に戻ります。


Part3:弦をシャッフルする

if password_check(password) == True:
    new_pwd = ''.join(random.sample(password,len(password)))
    print new_pwd

このコードは、パスワード全体をシャッフルし、それを新しい変数に割り当てます。new_pwd


ps。 コード全体はここにあります!

于 2016-07-06T12:39:27.480 に答える
0

正規表現を使用して、正規表現に一致する文字があるかどうかを確認できます。

import re
string = "AaBbCc12"

if re.search('[a-z]',string)\
and re.search('[0-9]',string)\ 
and re.search('[A-Z]',string):
    print("This is a string you are looking for")
else:
    print("Nope")

これはかなり洗練されていないソリューションですが、理解と適応性の点では最速です。

于 2016-07-06T12:45:15.023 に答える