\
.( ) [ ] ^ $ . ? * +
. Если тебе нужен этот символ как просто символ, его надо экранировать! Т.е. если тебе нужно совпадение с символом ?
, надо писать \?
.[abc]
совпадёт с одним символом из указанных: a, b или c. Для задания диапазона можно сделать так: [a-z]
. Это зачастую короче.[^abc]
\w
описывает словесные символы (буквы, цифры и подчёркивание), \d
описывает цифры, и т.д. Аналогично, \W
и \D
описывают всё кроме словесных символов и цифр, соотв.re.sub(r'\W', '', 'test:_:test', re.I) # даст test_test
re.sub(r'[\W_]', '', 'test:_:test', re.I) # даст testtest
await bot.send_message(message.chat.id, 'Здравствуйте, какой продукт вы хотите преобрести?')
async def parse_card(card):
d = dict()
# из карточки берется html
# "вставляется" в объект супа
# и возвращается словарь
# внутри этой функции не используются await
return d
# submodule_1.py - модуль, содержащий часть функций бота
def setup(bot):
# bot - объект бота. Можешь добавить и другие полезные параметры, такие как:
# - объект logging.Logger для журналирования
# - объект соединения с БД
# - ну и что там ещё тебе потребуется
# все обработчики событий объявляем ВНУТРИ setup()
# тогда они смогут ссылаться на переданные параметры
@bot.command('/start') # например, чтобы использовать декораторы
def on_start(message):
message.reply('foobar')
# мы описали функцию setup(), но здесь мы её не вызываем!
# main.py - основной файл бота
bot = ... # создаём объект бота
import submodule_1 # импортируем модуль с функциями
# при вызове setup() будут заданы обработчики событий, описанные в ней
submodule_1.setup(bot) # функции передаём объект бота (и другие объекты, если она их ожидает)
# функцию setup() нужно вызывать не более одного раза!
# так можно добавлять столько модулей, сколько требуется.
bot.run() # дальше бота запускаем как обычно
f"SELECT premium FROM premusers WHERE id = {ctx.guild.id}"
@discord.app_commands.checks.dynamic_cooldown(factory, *, key=...)
If a factory function is given, it must be a function that accepts a single parameter of type discord.Interaction and must return a Cooldown or None. If None is returned then that cooldown is effectively bypassed.
var connInfo = new Renci.SshNet.PasswordConnectionInfo("<IP>", 22, "<USER>", "<PWD>");
var sshClient = new Renci.SshNet.SshClient(connInfo);
sshClient.Connect();
var stream = sshClient.CreateShellStream("", 0, 0, 0, 0, 0);
// Send the command
stream.WriteLine("echo 'sample command output'");
// Read with a suitable timeout to avoid hanging
string line;
while((line = stream.ReadLine(TimeSpan.FromSeconds(2))) != null)
{
Console.WriteLine(line);
// if a termination pattern is known, check it here and break to exit immediately
}
// ...
stream.Close();
// ...
sshClient.Disconnect();
@dp.callback_query_handler(text='1')
async def id1(callback: CallbackQuery):
def do_stuff_nocache(*args, **kwargs):
...
@lru_cache
def do_stuff(*args, **kwargs):
return do_stuff_nocache(*args, **kwargs)
@lru_cache
def do_stuff(*args, **kwargs):
...
print(do_stuff.__wrapped__(*args, **kwargs))
do_stuff.clear_cache()
но это очистит кэш вообще, что, скорее всего, нежелательно. SELECT user_id, join_date EXTRACT(DAY FROM date) as day FROM users VALUES (?, ?)