Python의 임의 문자열


96

파이썬에서 임의의 문자열을 어떻게 생성합니까?

나는 그것이 내가 만든 것입니다.

def random_id(length):
    number = '0123456789'
    alpha = 'abcdefghijklmnopqrstuvwxyz'
    id = ''
    for i in range(0,length,2):
        id += random.choice(number)
        id += random.choice(alpha)
    return id

보다 구체적으로 찾고자하는 것에 대한 몇 가지 예를 제공하십시오.
sberry

답변:


223

예를 들어 소문자로 문자열 생성 :

import random, string

def randomword(length):
   letters = string.ascii_lowercase
   return ''.join(random.choice(letters) for i in range(length))

결과 :

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'

3
지금까지 최고의 답변입니다. 그래도 randomword(length, source_alpha=string.lowercase)및을 사용 xrange(length)합니다.
Hank Gay

1
이것은 매우 좋은 대답이지만 OP는 질문을 수정하여이를 무효화했습니다. 그리고 자신의 답변을 제공합니다.
Blair Conrad

29
Python 3 호환성을 위해 다음을 사용하십시오.string.ascii_lowercase
dogwynn

@BlairConrad : 나는이 질문은 너무 광범위 등이었다라고 말하고 싶지만, os.urandom(length)응답 원래의 질문 과 @sth 잘못 OP의 마음을 읽을 수 있었다.
jfs

1
Python 3.6부터는 random.choices더 빠릅니다.
IanS

58

이 질문은 상당히, 어, 임의적이므로 다음과 같이 도움이 될 수 있습니다.

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17

6
많은 경우 무작위가 실제로 필요하지 않습니다. 오히려 당신에게 정말로 필요한 것은 독특합니다.
Chase Seibert

1
str(uuid.uuid4())문자열로 사용하려면 사용할 수 있습니다 .
Swagatika

2
str(uuid.uuid4()).split("-")[0]출력 :'4bcb6450'
Vlad Gulin 19

좋은 지적이야, 블라드. 더 긴 경우 ''.join (str (uuid.uuid4 ()). split ( '-'))도 작동합니다. 출력 : '00db8a458c71415c9a263ff08667dd93'
브랜든

35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk

산뜻한! 나는 실제로 이것을 임의의 암호 생성기에 사용하고 있습니다! 감사!
chandsie 2011

13
random.sample은 s에서 고유 한 문자를 샘플링합니다. 즉, 암호의 문자는 반복되지 않습니다. 이것은 수락 된 답변에서와 같이 random.choice를 사용하는 것보다 훨씬 덜 안전합니다.
Nick Zalutskiy

3
@NickZalutskiy : random.choice역시 안전하지 않습니다. 직접 사용 random.SystemRandom().choice()하거나 사용os.urandom() 하십시오 .
jfs

1
경고! 위의 두 가지 주석에 유의하십시오. random.sample은 고유 한 샘플을 반환합니다. 문자는 반복되지 않습니다. 따라서 반환 된 문자열은 덜 무작위입니다. 더 큰 문자열 오류의 경우 : 'ValueError : sample large than population'.
gaoithe

1
Python 3에서는 다음 lowercase으로 대체되어야합니다.ascii_lowercase
Attaque

18

원래 질문에 대한 답변 :

os.urandom(n)

인용 출처 : http://docs.python.org/2/library/os.html

암호화 사용에 적합한 n 개의 임의 바이트 문자열을 반환합니다.

이 함수는 OS 별 임의성 소스에서 임의의 바이트를 반환합니다. 반환 된 데이터는 암호화 애플리케이션에 대해 충분히 예측할 수 없지만 정확한 품질은 OS 구현에 따라 달라집니다. UNIX 계열 시스템에서는 / dev / urandom을 쿼리하고 Windows에서는 CryptGenRandom을 사용합니다. 임의성 소스를 찾지 못하면 NotImplementedError가 발생합니다.

플랫폼에서 제공하는 난수 생성기에 대한 사용하기 쉬운 인터페이스는 random.SystemRandom을 참조하십시오.


5

다음과 같은 임의의 ASCII 문자를 만들 수 있습니다.

import random
print chr(random.randint(0,255))

그런 다음 다음과 같이 긴 문자열을 작성하십시오.

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )

1
문자열 서식을 사용하는 이유는 무엇입니까? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz

5

어떤 종류의 임의의 문자열이 필요한지에 대해 많이 말하지 않았습니다. 그러나 어쨌든 random모듈을 살펴 봐야 합니다.

매우 간단한 솔루션이 아래에 붙여 넣어집니다.

import random

def randstring(length=10):
    valid_letters='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    return ''.join((random.choice(valid_letters) for i in xrange(length)))

print randstring()
print randstring(20)

참고로 return 문에서 가장 바깥 쪽의 괄호 집합을 생략 할 수 있습니다.
재귀 적

4

때로는 반 발음 가능하고 반 기억 가능한 임의의 문자열을 원했습니다.

import random

def randomWord(length=5):
    consonants="bcdfghjklmnpqrstvwxyz"
    vowels="aeiou"

    return "".join(random.choice((consonants,vowels)[i%2]) for i in range(length))

그때,

>>> randomWord()
nibit
>>> randomWord()
piber
>>> randomWord(10)
rubirikiro

4 글자 단어를 피하려면 4로 설정하지 마십시오 length.


3
random_name = lambda length: ''.join(random.sample(string.letters, length))

길이는 <= len (string.letters) = 53이어야합니다. 결과 예

   >>> [random_name(x) for x in range(1,20)]
['V', 'Rq', 'YtL', 'AmUF', 'loFdS', 'eNpRFy', 'iWFGtDz', 'ZTNgCvLA', 'fjUDXJvMP', 'EBrPcYKUvZ', 'GmxPKCnbfih', 'nSiNmCRktdWZ', 'VWKSsGwlBeXUr', 'i
stIFGTUlZqnav', 'bqfwgBhyTJMUEzF', 'VLXlPiQnhptZyoHq', 'BXWATvwLCUcVesFfk', 'jLngHmTBtoOSsQlezV', 'JOUhklIwDBMFzrTCPub']
>>> 

즐겨. ;)



0

이 함수는 대문자, 소문자, 숫자로 구성된 임의의 문자열을 생성하고 길이 구분자, no_of_blocks를 전달하여 문자열 형식을 지정합니다.

예 : len_sep = 4, no_of_blocks = 4는 다음 패턴을 생성합니다.

F4nQ-Vh5z-JKEC-WhuS

여기서 길이 구분자는 4 자 뒤에 "-"를 추가합니다.

XXXX-

블록 수는 다음과 같은 패턴을 문자열로 생성합니다.

XXXX-XXXX-XXXX-XXXX

단일 임의 문자열이 필요한 경우 no_of_blocks 변수를 1과 같게 유지하고 len_sep를 유지하여 임의 문자열의 길이를 지정하십시오.

예 : len_sep = 10, no_of_blocks = 1은 다음 패턴을 생성합니다. 길이가 10 인 임의의 문자열 ,

F01xgCdoDU

import random as r

def generate_random_string(len_sep, no_of_blocks):
    random_string = ''
    random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i in range(0,len_sep*no_of_blocks):
        if i % len_sep == 0 and i != 0:
            random_string += '-'
        random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
    return random_string

0
import random 
import string

def get_random_string(size):
    chars = string.ascii_lowercase+string.ascii_uppercase+string.digits
    ''.join(random.choice(chars) for _ in range(size))

print(get_random_string(20)

출력 : FfxjmkyyLG5HvLeRudDS


0

에서 python3.6+당신에게 사용할 수있는 secrets모듈을 :

secrets 모듈은 암호, 계정 인증, 보안 토큰 및 관련 비밀과 같은 데이터를 관리하는 데 적합한 암호화 된 강력한 난수를 생성하는 데 사용됩니다.

특히, 보안 또는 암호화가 아닌 모델링 및 시뮬레이션을 위해 설계된 랜덤 모듈의 기본 의사 난수 생성기보다 비밀이 우선적으로 사용되어야합니다.

768bit보안 토큰 생성 테스트 에서 다음을 발견했습니다.

  • random.choices()- 0.000246
  • secrets.choice()- 0.003529

secrets모듈은 느리지 만 그것을 테스트의 외부는 암호화 목적을 위해 사용되어야합니다 것입니다 :

import string, secrets

def random_string(size):        
        letters = string.ascii_lowercase+string.ascii_uppercase+string.digits            
        return ''.join(secrets.choice(letters) for i in range(size))

print(random_string(768))

-1

임의 가져 오기에서 아래 패키지 가져 오기 *


이것은 전혀 문제를 해결하지 않습니다. 이 패턴을 무작위로 생성하는 더 나은 (pythonic) 방법이
있습니까
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.