Как сделать несколько рандомных символов

laiser

Известный
Автор темы
184
90
Всем привет. Пользователь вводит такой текст [ b][ b][ b]FFF[c][c][c][c]
После [ b] заменяется на рандомную цифру, [c] заменяется на рандомную букву
Должно получиться такое: 934FFFgrgt



Подскажите, как можно заменить определенный текст на радомную цифру и символ, но чтобы каждый был разный

p.s. Пишу на python 3.9
 
Последнее редактирование:
Решение
Я поставил тебе симпу за старание и скажу спасибо за помощь.
Но проблемка в том, что мой вопрос в разделе Python, и я не понимаю, почему вы кидаете код для lua.
Хах, мы гении походу.

Python:
import random
import re
import string

text = "[ b][ b][ b]FFF[c][c][c]"

def randomCode( txt ):
    if not txt or len( txt ) == 0:
        return ""
 
    find_b = len( re.findall( "\[ b\]", txt ) )
    find_c = len( re.findall( "\[c\]", txt ) )
 
    for i in range( 0, find_b ):
        txt = txt.replace( "[ b]", str( random.randint( 0, 9 ) ), 1 )
 
    for i in range( 0, find_c ): #upd: я тут случайно 1 вместо 0 поставил, поправил
        rand_int = random.randint( 1, len( string.ascii_letters ) )
        txt = txt.replace( "[c]"...

Andrinall

Известный
678
531
Всем привет. Пользователь вводит такой текст [ b][ b][ b]FFF[c][c][c][c]
После [ b] заменяется на рандомную цифру, [c] заменяется на рандомную букву
Должно получиться такое: 34FFFgrgt



Подскажите, как можно заменить определенный текст на радомную цифру и символ, но чтобы каждый был разный
Lua:
local text = "[ b][ b][ b]FFF[c][c][c]"

math.randomseed(os.clock())
text = text:gsub("%[ b%]", math.random(0, 9)):gsub("%[c%]", string.char(math.random(32, 127))

print(text)

Писал с телефона, если где косякнул - сорян.

upd: [c] в этом коде заменяется на рандом символ из таблицы ascii, a не на рандом букву
 

laiser

Известный
Автор темы
184
90
Ничего кроме регулярок в голову не лезет.
А можно код? В регулярках вообще не шарю, хоть раз 100 пытался разобраться...
А код выше ну уж слишком не понятный и не рабочий(пытался починить)
 

Josski Molodoi

Активный
183
85
А можно код? В регулярках вообще не шарю, хоть раз 100 пытался разобраться...
А код выше ну уж слишком не понятный и не рабочий(пытался починить)
Я сам сегодня пытался разобраться, ничего не понял :))) как только эти луашники с ними работают...
 

ice_ice

Участник
61
14
как вариант можено создать массив с буквами :
local alph = {'a', 'b', 'c', ... )

дальше получаешь значение:
math.randomseed(os.time())
rr = math.random(1, 26)

и юзаешь его как ключ к таблице:
alph[rr]
но думаю это по-говнокодски наверное)
 

Andrinall

Известный
678
531
Lua:
local text = "[ b][ b][ b]FFF[c][c][c]"

math.randomseed(os.clock())
text = text:gsub("%[ b%]", math.random(0, 9)):gsub("%[c%]", string.char(math.random(32, 127))

print(text)

Писал с телефона, если где косякнул - сорян.

upd: [c] в этом коде заменяется на рандом символ из таблицы ascii, a не на рандом букву
Немного поправлю и дополню свой код, раз уж зашёл с пк и вижу сообщение, что он не рабочий.
Lua:
local text = "[ b][ b][ b]FFF[c][c][c]"

math.randomseed(os.time())
for i = 1, text:find("[[ b]]+") do
  text = text:gsub("%[ b%]", math.random(0, 9), 1)
end

for i = 1, text:find("[[c]]+") do
  local symbol = string.char( ({math.random(65, 90), math.random(97,122)})[math.random(2)] )
  text = text:gsub("%[c%]", symbol, 1)
end

print(text)

Lua:
local text = "[ b][ b][ b]FFF[c][c][c]"

math.randomseed(os.time())
for i = 1, text:find("[[ b]]+") do -- проходимся по тексту кол-во раз, сколько было найдено совпадение с паттерном
  text = text:gsub("%[ b%]", math.random(0, 9), 1) -- заменяем каждое совпадение на псевдослучайное число
end

for i = 1, text:find("[[c]]+") do
  local symbol = string.char( ({math.random(65, 90), math.random(97,122)})[math.random(2)] ) --[[
    в, скажем так, безымянную таблицу кидаем 2 псевдослучайных числа,
    это номера символов верхнего и нижнего регистров в ASCII Table, выбирается 1 символ верхнего и 1 нижнего регистров
    далее из этих двух псевдослучайных чисел выбираем одно и переводим в символ функцией string.char()
  ]]
  text = text:gsub("%[c%]", symbol, 1) -- заменяем каждое совпадение на псевдослучайный символ ;)
end

print(text) -- выводим получившийся текст

Можно это всё сделать отдельной функцией
Lua:
function randomCode(txt)
  if not txt or #txt == 0 then return "" end

  math.randomseed(os.time())
  for i = 1, txt:find("[[ b]]+") do
    txt = txt:gsub("%[ b%]", math.random(0, 9), 1)
  end

  for i = 1, txt:find("[[c]]+") do
    local symbol = string.char( ({math.random(65, 90), math.random(97,122)})[math.random(2)] )
    txt = txt:gsub("%[c%]", symbol, 1)
  end

  return txt
end


И да, код рабочий:
1650436972686.png
 
Последнее редактирование:
  • Нравится
Реакции: laiser

laiser

Известный
Автор темы
184
90
Немного поправлю и дополню свой код, раз уж зашёл с пк и вижу сообщение, что он не рабочий.
Lua:
local text = "[ b][ b][ b]FFF[c][c][c]"

math.randomseed(os.time())
for i = 1, text:find("[[ b]]+") do
  text = text:gsub("%[ b%]", math.random(0, 9), 1)
end

for i = 1, text:find("[[c]]+") do
  local symbol = string.char( ({math.random(65, 90), math.random(97,122)})[math.random(2)] )
  text = text:gsub("%[c%]", symbol, 1)
end

print(text)

Lua:
local text = "[ b][ b][ b]FFF[c][c][c]"

math.randomseed(os.time())
for i = 1, text:find("[[ b]]+") do -- проходимся по тексту кол-во раз, сколько было найдено совпадение с паттерном
  text = text:gsub("%[ b%]", math.random(0, 9), 1) -- заменяем каждое совпадение на псевдослучайное число
end

for i = 1, text:find("[[c]]+") do
  local symbol = string.char( ({math.random(65, 90), math.random(97,122)})[math.random(2)] ) --[[
    в, скажем так, безымянную таблицу кидаем 2 псевдослучайных числа,
    это номера символов верхнего и нижнего регистров в ASCII Table, выбирается 1 символ верхнего и 1 нижнего регистров
    далее из этих двух псевдослучайных чисел выбираем одно и переводим в символ функцией string.char()
  ]]
  text = text:gsub("%[c%]", symbol, 1) -- заменяем каждое совпадение на псевдослучайный символ ;)
end

print(text) -- выводим получившийся текст

Можно это всё сделать отдельной функцией
Lua:
function randomCode(txt)
  if not txt or #txt == 0 then return "" end

  math.randomseed(os.time())
  for i = 1, txt:find("[[ b]]+") do
    txt = txt:gsub("%[ b%]", math.random(0, 9), 1)
  end

  for i = 1, txt:find("[[c]]+") do
    local symbol = string.char( ({math.random(65, 90), math.random(97,122)})[math.random(2)] )
    txt = txt:gsub("%[c%]", symbol, 1)
  end

  return txt
end


И да, код рабочий:Посмотреть вложение 144273
Я поставил тебе симпу за старание и скажу спасибо за помощь.
Но проблемка в том, что мой вопрос в разделе Python, и я не понимаю, почему вы кидаете код для lua.
 
  • Нравится
Реакции: Andrinall и moreveal

Andrinall

Известный
678
531
Я поставил тебе симпу за старание и скажу спасибо за помощь.
Но проблемка в том, что мой вопрос в разделе Python, и я не понимаю, почему вы кидаете код для lua.
Хах, мы гении походу.

Python:
import random
import re
import string

text = "[ b][ b][ b]FFF[c][c][c]"

def randomCode( txt ):
    if not txt or len( txt ) == 0:
        return ""
 
    find_b = len( re.findall( "\[ b\]", txt ) )
    find_c = len( re.findall( "\[c\]", txt ) )
 
    for i in range( 0, find_b ):
        txt = txt.replace( "[ b]", str( random.randint( 0, 9 ) ), 1 )
 
    for i in range( 0, find_c ): #upd: я тут случайно 1 вместо 0 поставил, поправил
        rand_int = random.randint( 1, len( string.ascii_letters ) )
        txt = txt.replace( "[c]", string.ascii_letters[ rand_int-1:rand_int ], 1 )
 
    return txt


print( randomCode( text ) )

В целом тоже работает :)
1650444185375.png


Python:
import random
import re
import string
import time

def randomCode(txt):
    if not txt or len(txt) == 0:
        return ""
 
    find_b = len(re.findall( "\[ b\]", txt ))
    find_c = len(re.findall( "\[c\]", txt ))
 
    for i in range(0, find_b):
        txt = txt.replace("[ b]", str(random.randint(0, 9)), 1)
 
    for i in range(0, find_c):
        rand_int = random.randint(1, len(string.ascii_letters))
        txt = txt.replace("[c]", string.ascii_letters[rand_int-1:rand_int], 1)
 
    return txt

text = "[ b][ b][ b]FFF[c][c][c]"
for i in range(0, 24):
    print(randomCode(text))
    time.sleep(1)
 
Последнее редактирование:

Neon3333

Известный
181
71
Example:
import re
import string
from random import choice


def replace(user_input: str) -> str:
    letters = ''.join(choice(string.ascii_letters) for _ in range(3))
    numbers = ''.join(choice(string.digits) for _ in range(3))
    return f"{numbers}{user_input.replace('[ b][ b][ b]', '').replace('[c][c][c]', '')}{letters}"


def regex_replace(user_input: str) -> str:

    for target in re.finditer(r'\[ b\]', user_input):
        user_input = re.sub(target.re.pattern, choice(string.digits), user_input, count=1)

    for target in re.finditer(r'\[c\]', user_input):
        user_input = re.sub(target.re.pattern, choice(string.ascii_letters), user_input, count=1)

    return user_input


Постановка задачи у тебя очень мутная. Ты даешь четкий шаблон текста, при этом просишь сделать это регуляркой.
Если у тебя текст всегда соответствует шаблону [ b][ b][ b]FFF[c][c][c], тогда не имеет никакого смысла использовать регекс, просто на входе проверить, соответствие введенной строки данному шаблону, в таком случае будет уместна первая функция - replce. Если же ты не знаешь количество вхождений [c] и [ b] в строке, тогда нужно использовать только второй вариант - regex_replace, он заменит все вхождения подстрок.
 
  • Нравится
Реакции: laiser и Andrinall

laiser

Известный
Автор темы
184
90
Example:
import re
import string
from random import choice


def replace(user_input: str) -> str:
    letters = ''.join(choice(string.ascii_letters) for _ in range(3))
    numbers = ''.join(choice(string.digits) for _ in range(3))
    return f"{numbers}{user_input.replace('[ b][ b][ b]', '').replace('[c][c][c]', '')}{letters}"


def regex_replace(user_input: str) -> str:

    for target in re.finditer(r'\[ b\]', user_input):
        user_input = re.sub(target.re.pattern, choice(string.digits), user_input, count=1)

    for target in re.finditer(r'\[c\]', user_input):
        user_input = re.sub(target.re.pattern, choice(string.ascii_letters), user_input, count=1)

    return user_input


Постановка задачи у тебя очень мутная. Ты даешь четкий шаблон текста, при этом просишь сделать это регуляркой.
Если у тебя текст всегда соответствует шаблону [ b][ b][ b]FFF[c][c][c], тогда не имеет никакого смысла использовать регекс, просто на входе проверить, соответствие введенной строки данному шаблону, в таком случае будет уместна первая функция - replce. Если же ты не знаешь количество вхождений [c] и [ b] в строке, тогда нужно использовать только второй вариант - regex_replace, он заменит все вхождения подстрок.
Я вообще не писал про регулярные выражения, не выдумывай....
Спасибо за код, думаю еще пригодится. Он чуть короче, чем код выше. Но тот я уже вставил в свой скрипт
 

Neon3333

Известный
181
71
Я вообще не писал про регулярные выражения, не выдумывай....
Спасибо за код, думаю еще пригодится. Он чуть короче, чем код выше. Но тот я уже вставил в свой скрипт
А можно код? В регулярках вообще не шарю, хоть раз 100 пытался разобраться...
А код выше ну уж слишком не понятный и не рабочий(пытался починить)
Данное сообщение косвенно указывает на это