Я хотел бы знать, возможно ли каким-либо образом вернуть один случайный символ из шаблона регулярного выражения, записанного в краткосрочной перспективе.
Так вот мой случай ..
Я создал несколько шаблонов регулярных выражений, содержащихся в Enum:
import random
from _operator import invert
from enum import Enum
import re
class RegexExpression(Enum):
LOWERCASE = re.compile('a-z')
UPPERCASE = re.compile('A-Z')
DIGIT = re.compile('\d')
SYMBOLS = re.compile('\W')
Я хочу, чтобы они возвращались в виде строки, содержащей все символы, которые выражает регулярное выражение, на основе этого метода ниже:
def create_password(symbol_count, digit_count, lowercase_count, uppercase_count):
pwd = ""
for i in range(1, symbol_count):
pwd.join(random.choice(invert(RegexExpression.SYMBOLS.value)))
for i in range(1, digit_count):
pwd.join(random.choice(invert(RegexExpression.DIGIT.value)))
for i in range(1, lowercase_count):
pwd.join(random.choice(invert(RegexExpression.LOWERCASE.value)))
for i in range(1, uppercase_count):
pwd.join(random.choice(invert(RegexExpression.UPPERCASE.value)))
return pwd
Я пробовал несколько вещей, но единственно возможный вариант - использовать Enum, содержащий длинные шаблоны регулярных выражений или строки, как в следующем примере:
LOWERCASE = "abcdefghijklmnopqrstuvwxyz"
... И так далее с другими используемыми переменными.
Какие-либо предложения или решения для этого сценария?
- EDIT -
Безумный физик принес решение для моей проблемы - Большое спасибо!
Вот рабочий код:
def generate_password(length):
tmp_length = length
a = random.randint(1, length - 3)
tmp_length -= a
b = random.randint(1, length - a - 2)
tmp_length -= b
c = random.randint(1, length - a - b - 1)
tmp_length -= c
d = tmp_length
pwd = ""
for i in range(0, a):
pwd += random.choice(string.ascii_lowercase)
for i in range(0, b):
pwd += random.choice(string.ascii_uppercase)
for i in range(0, c):
pwd += random.choice(string.digits)
for i in range(0, d):
pwd += random.choice(string.punctuation)
pwd = ''.join(random.sample(pwd, len(pwd)))
return pwd