如何生成大小为N的字符串,由数字和大写英文字母组成,例如:
6个754z4英国U911K4型
如何生成大小为N的字符串,由数字和大写英文字母组成,例如:
6个754z4英国U911K4型
当前回答
一个简单的例子:
import string
import random
character = string.lowercase + string.uppercase + string.digits + string.punctuation
char_len = len(character)
# you can specify your password length here
pass_len = random.randint(10,20)
password = ''
for x in range(pass_len):
password = password + character[random.randint(0,char_len-1)]
print password
其他回答
只需使用Python的内置uuid:
如果uuid适合您的用途,请使用内置的uuid包。
单线解决方案:
导入uuid;uuid.uuid4().hhex.upper()[0:6]
深度版本:
例子:
import uuid
uuid.uuid4() #uuid4 => full random uuid
# Outputs something like: UUID('0172fc9a-1dac-4414-b88d-6b9a6feb91ea')
如果您完全需要您的格式(例如,“6U1S75”),可以这样做:
import uuid
def my_random_string(string_length=10):
"""Returns a random string of length string_length."""
random = str(uuid.uuid4()) # Convert UUID format to a Python string.
random = random.upper() # Make all characters uppercase.
random = random.replace("-","") # Remove the UUID '-'.
return random[0:string_length] # Return the random string.
print(my_random_string(6)) # For example, D9E50C
我以为还没有人回答这个问题,哈哈!但嘿,这是我自己的尝试:
import random
def random_alphanumeric(limit):
#ascii alphabet of all alphanumerals
r = (range(48, 58) + range(65, 91) + range(97, 123))
random.shuffle(r)
return reduce(lambda i, s: i + chr(s), r[:random.randint(0, len(r))], "")
一种更简单、更快但随机性稍低的方法是使用random.sample,而不是分别选择每个字母。如果允许n次重复,则将随机基础放大n倍。
import random
import string
char_set = string.ascii_uppercase + string.digits
print ''.join(random.sample(char_set*6, 6))
注:random.sample防止字符重复使用,将字符集的大小相乘可以进行多次重复,但它们的可能性仍然小于纯随机选择。如果我们选择长度为6的字符串,并选择“X”作为第一个字符,在选择示例中,第二个字符获得“X”的几率与第一个字符获得的几率相同。在random.sample实现中,将“X”作为任何后续字符的几率只有将其作为第一个字符的几率的6/7
一种更快、更简单、更灵活的方法是使用strgen模块(pip-installStringGenerator)。
生成包含大写字母和数字的6个字符随机字符串:
>>> from strgen import StringGenerator as SG
>>> SG("[\u\d]{6}").render()
u'YZI2CI'
获取唯一列表:
>>> SG("[\l\d]{10}").render_list(5,unique=True)
[u'xqqtmi1pOk', u'zmkWdUr63O', u'PGaGcPHrX2', u'6RZiUbkk2i', u'j9eIeeWgEF']
保证字符串中有一个“特殊”字符:
>>> SG("[\l\d]{10}&[\p]").render()
u'jaYI0bcPG*0'
随机HTML颜色:
>>> SG("#[\h]{6}").render()
u'#CEdFCa'
等
我们需要意识到:
''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
可能没有数字(或大写字符)。
strgen在开发时间上比上述任何解决方案都快。Ignacio的解决方案是执行速度最快的运行时,使用Python标准库是正确的答案。但你几乎不会以这种形式使用它。你会希望使用SystemRandom(如果不可用,则回退),确保表示所需的字符集,使用unicode(或不使用),确保连续调用产生唯一字符串,使用字符串模块字符类之一的子集等。这一切都需要比提供的答案中更多的代码。各种推广解决方案的尝试都有局限性,strgen使用简单的模板语言以更简洁和表达能力解决了这些问题。
在PyPI上:
pip install StringGenerator
披露:我是strgen模块的作者。
import string
from random import *
characters = string.ascii_letters + string.punctuation + string.digits
password = "".join(choice(characters) for x in range(randint(8, 16)))
print password