PDA

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


laiser
19.04.2022, 21:55
Всем привет. Пользователь вводит такой текст [ b][ b][ b]FFF[c][c][c][c]

После [ b]заменяется на рандомную цифру, [c] заменяется на рандомную букву

Должно получиться такое: 934FFFgrgt

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

p.s. Пишу на python 3.9

Andrinall
19.04.2022, 22:22
Всем привет. Пользователь вводит такой текст [ 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 не на рандом букву

pomidorq
19.04.2022, 22:31
Ничего кроме регулярок в голову не лезет.

laiser
20.04.2022, 00:27
Ничего кроме регулярок в голову не лезет.


А можно код? В регулярках вообще не шарю, хоть раз 100 пытался разобраться...

А код выше ну уж слишком не понятный и не рабочий(пытался починить)

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


Я сам сегодня пытался разобраться, ничего не понял :))) как только эти луашники с ними работают...

ice_ice
20.04.2022, 05:30
как вариант можено создать массив с буквами :

local alph = {'a', 'b', 'c', ... )

дальше получаешь значение:

math.randomseed(os.time())

rr = math.random(1, 26)

и юзаешь его как ключ к таблице:

alph[rr]

но думаю это по-говнокодски наверное)

Andrinall
20.04.2022, 10:35
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




И да, код рабочий:





https://forum.antichat.xyz/attachments/28021119/img_acc5254c82.png

laiser
20.04.2022, 11:32
Немного поправлю и дополню свой код, раз уж зашёл с пк и вижу сообщение, что он не рабочий.

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




И да, код рабочий:


Я поставил тебе симпу за старание и скажу спасибо за помощь.

Но проблемка в том, что мой вопрос в разделе Python, и я не понимаю, почему вы кидаете код для lua.

Andrinall
20.04.2022, 12:40
Я поставил тебе симпу за старание и скажу спасибо за помощь.
Но проблемка в том, что мой вопрос в разделе 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
)
)




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

https://forum.antichat.xyz/attachments/28021171/img_3d591bfc54.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
20.04.2022, 15:11
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
20.04.2022, 20:23
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
20.04.2022, 20:42
Я вообще не писал про регулярные выражения, не выдумывай....
Спасибо за код, думаю еще пригодится. Он чуть короче, чем код выше. Но тот я уже вставил в свой скрипт





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


Данное сообщение косвенно указывает на это