python - لغة - اوامر بايثون




توليد سلسلة عشوائية بأحرف كبيرة وأرقام في بايثون (17)

ببساطة استخدام uiid بايثون مدمج:

إذا كانت UUID مقبولة للأغراض الخاصة بك ، استخدم الحزمة uuid المضمنة.

حل خط واحد:

import uuid; str(uuid.uuid4().get_hex().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

أريد إنشاء سلسلة من الحجم N.

يجب أن يتكون من أرقام وحروف إنجليزية كبيرة مثل:

  • 6U1S75
  • 4Z4UKK
  • U911K4

كيف يمكنني تحقيق ذلك بطريقة pythonic ؟


(1) سيعطيك هذا كل الحروف والأرقام:

import string, random
passkey=''
for x in range(8):
    if random.choice([1,2]) == 1:
        passkey += passkey.join(random.choice(string.ascii_uppercase))
    else:
        passkey += passkey.join(random.choice(string.digits))
print passkey 

(2) إذا أردت لاحقًا تضمين أحرف صغيرة في مفتاحك ، فسيعمل هذا أيضًا:

import string, random
passkey=''
for x in range(8):
    if random.choice([1,2]) == 1:
        passkey += passkey.join(random.choice(string.ascii_letters))
    else:
        passkey += passkey.join(random.choice(string.digits))
print passkey  

أود أن أقترح عليك الخيار التالي:

import crypt
n = 10
crypt.crypt("any sring").replace('/', '').replace('.', '').upper()[-n:-1]

الوضع البارانوي:

import uuid
import crypt
n = 10
crypt.crypt(str(uuid.uuid4())).replace('/', '').replace('.', '').upper()[-n:-1]

إذا كنت بحاجة إلى سلسلة عشوائية بدلاً من واحدة عشوائية زائفة ، فيجب استخدام os.urandom كمصدر

from os import urandom
from itertools import islice, imap, repeat
import string

def rand_string(length=5):
    chars = set(string.ascii_uppercase + string.digits)
    char_gen = (c for c in imap(urandom, repeat(1)) if c in chars)
    return ''.join(islice(char_gen, None, length))

استناداً إلى إجابة أخرى ، معظم الطرق خفيفة الوزن لإنشاء سلسلة عشوائية ورقم ست عشري عشوائي ، أفضل إصدار من الإجابة المقبولة سيكون:

('%06x' % random.randrange(16**6)).upper()

أسرع بكثير.


اعتقدت أن أحدا لم يجيب على هذا بعد! لكن مهلا ، أنا أذهب إليه:

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-repetitions ، قم بتكبير الأساس العشوائي الخاص بك بواسطة 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" للحرف الثاني هي نفس احتمالات الحصول على "X" مثل الشخصية الأولى. في تطبيق random.sample ، فإن احتمالات الحصول على "X" كأي حرف لاحق هي 6/7 فقط فرصة الحصول عليها كحرف أول


طريقة أسرع وأسهل وأكثر مرونة للقيام بذلك هي استخدام وحدة strgen ( pip install StringGenerator ).

إنشاء سلسلة عشوائية من 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.


لقد وجدت هذا أبسط وأنظف.

str_Key           = ""
str_FullKey       = "" 
str_CharacterPool = "01234ABCDEFfghij~>()"
for int_I in range(64): 
    str_Key = random.choice(str_CharacterPool) 
    str_FullKey = str_FullKey + str_Key 

كل ما عليك هو تغيير 64 لتغيير الطول ، وتغيير CharacterPool للقيام بالألفا alpha الرقمية فقط أو الرقمية فقط أو أحرف غريبة أو أي شيء تريده.


من Python 3.6 يجب عليك استخدام وحدة secrets إذا كنت بحاجة إلى أن يكون آمنًا بشكل مشفر بدلاً من الوحدة random (وإلا تكون هذه الإجابة مماثلة لواحدةIgnacio Vazquez-Abrams):

from secrets import choice
import string

''.join([choice(string.ascii_uppercase + string.digits) for _ in range(N)])

ملاحظة إضافية واحدة: الفهم قائمة أسرع في حالة str.join من استخدام تعبير مولد!


هذه الطريقة هي أسرع قليلا ، وأكثر إزعاجا قليلا ، من طريقة random.choice () نشر Ignacio.

إنه يستفيد من طبيعة الخوارزميات شبه العشوائية ، والبنوك على الببتة ، والتحول أسرع من توليد رقم عشوائي جديد لكل حرف.

# must be length 32 -- 5 bits -- the question didn't specify using the full set
# of uppercase letters ;)
_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'

def generate_with_randbits(size=32):
    def chop(x):
        while x:
            yield x & 31
            x = x >> 5
    return  ''.join(_ALPHABET[x] for x in chop(random.getrandbits(size * 5))).ljust(size, 'A')

... إنشاء مولد يأخذ أرقام 5 بت في وقت 0. 31 حتى لا يبقى

... join () نتائج المولد على عدد عشوائي مع البتات الصحيحة

مع Timeit ، للحصول على سلاسل 32 حرف ، كان التوقيت:

[('generate_with_random_choice', 28.92901611328125),
 ('generate_with_randbits', 20.0293550491333)]

... ولكن مع سلاسل الأحرف 64 ، يخسر randbits؛)

ربما لن استخدم هذا النهج أبداً في قانون الإنتاج ما لم أكن حقاً أكره زملائي في العمل.

edit: تم تحديثه ليناسب السؤال (بالأحرف الكبيرة والأرقام فقط) ، واستخدم مشغلي bitwise & and >> بدلاً من٪ و //


واحد بسيط:

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

يمكنك استخدام الرمز

var chars = "ABC123";
        var random = new Random();
        var result = new string(
            Enumerable.Repeat(chars, 7) //Change 7 to any number of characters you want in your outcome
                      .Select(s => s[random.Next(s.Length)])
                      .ToArray());

        textBox1.Text = result;

هذا سوف يبصقون عشوائيًا بنمط 7 أبجدي رقمي عشوائي ، ما عليك سوى تغيير الرقم 7 إلى أي رقم ترغب فيه ، وسوف ينتج ذلك العدد من الأرقام و / أو الحروف.

طريقة أخرى لكتابة هذا هو على النحو التالي ...

var chars = "ABC123";
var stringChars = new char[7]; //Change 7 to any number of characters you want in your outcome
var random = new Random();

for (int i = 0; i < stringChars.Length; i++)
{

stringChars[i] = chars[random.Next(chars.Length)];

}

var finalString = new String(stringChars);

textBox1.Text = finalstring;`

أنا غير متأكد من كيفية إضافة قيود مثل جعلها إلى حيث لا تسمح لأرقام و / أو أحرف معينة أن تكون بجانب بعضها البعض أو تتكرر مثل الحصول على "AAA123" إذا كان أي شخص يعرف كيفية تقييد النتيجة للحصول على شيء من هذا القبيل هذا يرجى التعليق مرة أخرى


الإجابة في سطر واحد:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

أو حتى أقصر يبدأ بـ Python 3.6 باستخدام random.choices() :

''.join(random.choices(string.ascii_uppercase + string.digits, k=N))

نسخة مشفرة أكثر أمانًا راجع https://.com/a/23728630/2213647 :

''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))

في التفاصيل ، مع وظيفة نظيفة لمزيد من إعادة الاستخدام:

>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
...    return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'

كيف يعمل ؟

نستورد string ، وهي وحدة تحتوي على تسلسلات من أحرف ASCII الشائعة random ، وهي وحدة تتعامل مع توليد عشوائي.

string.ascii_uppercase + string.digits يسلسل قائمة الأحرف التي تمثل أحرف وأرقام ASCII الكبيرة:

>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

ثم نستخدم فهمًا بالقائمة لإنشاء قائمة بالعناصر 'n':

>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']

في المثال أعلاه ، نستخدم [ لإنشاء القائمة ، لكننا لا نقوم id_generator حتى لا تقوم بايثون بإنشاء القائمة في الذاكرة ، ولكنها تولد العناصر على الطاير ، واحدة تلو الأخرى (المزيد عن هذا here ) .

بدلاً من المطالبة بإنشاء "n" مرات سلسلة elem ، سنطلب من Python إنشاء حرف n عشوائي ، ويتم اختياره من سلسلة من الأحرف:

>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'

ولذلك ، فإن random.choice(chars) for _ in range(size) بالفعل بإنشاء تسلسل من حروف size . الأحرف التي يتم اختيارها عشوائياً من chars :

>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']

ثم ننضم إليهم بسلسلة فارغة حتى يصبح التسلسل عبارة عن سلسلة:

>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'

>>> import random
>>> str = []
>>> chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
>>> num = int(raw_input('How long do you want the string to be?  '))
How long do you want the string to be?  10
>>> for k in range(1, num+1):
...    str.append(random.choice(chars))
...
>>> str = "".join(str)
>>> str
'tm2JUQ04CK'

تختار الدالة random.choice إدخال عشوائي في قائمة. يمكنك أيضًا إنشاء قائمة حتى يمكنك إلحاق الحرف في العبارة. في نهاية str هو ['t' ، 'm' ، '2' ، 'J' ، 'U' ، 'Q' ، '0' ، '4' ، 'C' ، 'K'] ، ولكن str = "".join(str) يعتني بذلك ، 'tm2JUQ04CK' مع 'tm2JUQ04CK' .

أتمنى أن يساعدك هذا!


>>> import string 
>>> import random

لا يزال المنطق التالي يولد 6 عينة عشوائية

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits),6))
JT7K3Q

لا حاجة للتضاعف في 6

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits)*6,6))

TK82HK

import uuid
lowercase_str = uuid.uuid4().hex  

lowercase_str هي قيمة عشوائية مثل 'cea8b32e00934aaea8c005a35d85a5c0'

uppercase_str = lowercase_str.upper()

uppercase_str هو 'CEA8B32E00934AAEA8C005A35D85A5C0'







random