Python 修改随机字生成器以确保特定字符类型

Python 修改随机字生成器以确保特定字符类型,python,Python,我现在正在学习python并开始学习。我一直在使用这个随机字生成器,我希望对它进行修改,这样它就可以根据ascii码从列表中选择字符作为范围 import random wordLen=random.randint(7,14) charList=[] asciiList=list(range(48,57))+list(range(65,90))+list(range(97,122)) for a in range(wordLen): ASCIIcode=random.choice(asc

我现在正在学习python并开始学习。我一直在使用这个随机字生成器,我希望对它进行修改,这样它就可以根据ascii码从列表中选择字符作为范围

import random
wordLen=random.randint(7,14)
charList=[]
asciiList=list(range(48,57))+list(range(65,90))+list(range(97,122))
for a in range(wordLen):
    ASCIIcode=random.choice(asciiList)
    charList.append(chr(ASCIIcode))
print(''.join(charList))
在这里,您可以看到一个名为asciiList的列表,其中我定义了数字、小写和大写

现在,我将其分为三个列表,用于第二个版本的程序:

length = random.randint(7, 14)

set1 = list(range(65,90))            # A-Z   
set2 = list(range(48,57))            # 0-9
set3 = list(range(97,122))           # a-z
build = [set1] + [set2] + [set3]
我很难让程序确保生成的最终单词(根据我的完整程序)至少有一个大写、一个小写和一个数字。我理解这一点(当我在一个新程序中写这篇文章时,我在这里使用了不同的变量名):

while len(word)

也就是说,在程序达到定义的长度之前,从三个集合中随机选取一个,但确保程序至少选取一次,但我正在努力完成最后一步。是否有人对该计划的一段时间循环有潜在的建议?感谢您的建议

您可以从每个所需的字符集中选择一个字符,然后从完整的字符集中填充剩余的字符。之后,只需洗牌剩下的字符串

chars = [random.choice(s) for s in [set1, set2, set3]] +\
        [random.choice(build) for _ in range(length - 3)]
random.shuffle(chars)

chars = ''.join(map(chr, chars))
注:您对
构建的定义可能是错误的。试试这个:

build = set1 + set2 + set3
使此代码正常工作

此外,您还可以使用该模块提供您的套件



PS 2:如果您正在做一些密码生成器的工作,出于安全原因,在调用模块中的函数之前,您可能希望使用
random=random.SystemRandom()
。使用非确定性随机数生成器可以避免可能复制数字生成器并预测生成的以下密码的攻击。

您可以从每个所需集合中选择一个字符,然后从完整集合中填充剩余的字符。之后,只需洗牌剩下的字符串

chars = [random.choice(s) for s in [set1, set2, set3]] +\
        [random.choice(build) for _ in range(length - 3)]
random.shuffle(chars)

chars = ''.join(map(chr, chars))
import random

from string import ascii_uppercase, ascii_lowercase, ascii_letters, digits

pool = ascii_letters + digits
wordLen=random.randint(7,14)
answer = random.sample(pool, wordLen)

while True:
    if not any(char.isupper() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(ascii_uppercase)
        continue

    if not any(char.islower() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(ascii_lowercase)
        continue

    if not any(char.isdigit() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(digits)
        continue

    break

answer = ''.join(answer)
注:您对
构建的定义可能是错误的。试试这个:

build = set1 + set2 + set3
使此代码正常工作

此外,您还可以使用该模块提供您的套件



PS 2:如果您正在做一些密码生成器的工作,出于安全原因,在调用模块中的函数之前,您可能希望使用
random=random.SystemRandom()
。使用非确定性随机数生成器可能会避免可能复制数字生成器并预测生成的以下密码的攻击。

明白了!似乎是我需要使用的逻辑,但我想我被变量构建弄糊涂了,因为我似乎无法成功地将其集成到我的编码中。我似乎无法在这里向您展示我的代码,因为当我粘贴它时,它的格式不正确(新到堆栈)。如何显示我现在重新工作的示例?@MariuszAndrzejewski您似乎想验证生成的字符串是否有效,但我相信知道如何正确生成字符串将对您帮助更大。明白了!似乎是我需要使用的逻辑,但我想我被变量构建弄糊涂了,因为我似乎无法成功地将其集成到我的编码中。我似乎无法在这里向您展示我的代码,因为当我粘贴它时,它的格式不正确(新到堆栈)。如何显示我现在重新工作过的示例?@MariuszAndrzejewski您似乎想验证生成的字符串是否有效,但我相信知道如何正确生成字符串将对您帮助更大。我很高兴有更多人了解
字符串
模块。这么干净!知道了!所以你不会真正使用不同的列表?只是确保如果没有X字符类型,那么添加该类型?当三种类型中的每一种都被添加后,答案的其余部分是如何用剩下的字符填充的?谢谢这三条if语句检查您的角色类型。如果该类型未在列表中表示,则会将随机元素更改为包含该字符这可能根本不起作用,除非在循环中运行。。。如果您碰巧拥有
'aaaaaa'
并将其转换为
'aaaaaa'
,然后转换为
'aaaa3a'
,您仍然缺少一个字符类。。。总的来说,这种方法过于冗长且容易出错。只需为其生成正确的内容即可once@JBernardo当前位置我只是在想,关于错误。那里我很高兴有更多的人知道
string
模块。这么干净!知道了!所以你不会真正使用不同的列表?只是确保如果没有X字符类型,那么添加该类型?当三种类型中的每一种都被添加后,答案的其余部分是如何用剩下的字符填充的?谢谢这三条if语句检查您的角色类型。如果该类型未在列表中表示,则会将随机元素更改为包含该字符这可能根本不起作用,除非在循环中运行。。。如果您碰巧拥有
'aaaaaa'
并将其转换为
'aaaaaa'
,然后转换为
'aaaa3a'
,您仍然缺少一个字符类。。。总的来说,这种方法过于冗长且容易出错。只需为其生成正确的内容即可once@JBernardo当前位置我只是在想,关于错误。那里这应该可以解决问题
import random

from string import ascii_uppercase, ascii_lowercase, ascii_letters, digits

pool = ascii_letters + digits
wordLen=random.randint(7,14)
answer = random.sample(pool, wordLen)

while True:
    if not any(char.isupper() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(ascii_uppercase)
        continue

    if not any(char.islower() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(ascii_lowercase)
        continue

    if not any(char.isdigit() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(digits)
        continue

    break

answer = ''.join(answer)