(\d-\d{4}/\d{2,3}/)\d{0,2}(\d{2})
. Пример:import re
r = re.compile(r'(\d-\d{4}/\d{2,3}/)\d{0,2}(\d{2})')
m = r.match("1-2345/678/0099")
print(m.groups()) # выведет ('1-2345/678/', '99')
(\d{9})
import re
r = re.compile(r'(\d{9})')
m = r.match("123456789")
print(m.groups()) # выведет ('123456789', )
search_results = googlesearch.search(query, num_results=3)
внутри ask(), и обработать полученные результаты - невелико повторение. Я бы сделал именно так.# Messageable - это что-то, чему можно послать текстовое сообщение. Это может быть канал, пользователь, контекст команды...
async def search_and_reply(query: str, ctx: discord.abc.Messageable) -> None:
try:
search_results = googlesearch.search(query, num_results=3)
if search_results:
await ctx.send("Результаты поиска в Google:")
for result in search_results:
await ctx.send(result)
else:
await ctx.send("Ничего не найдено.")
except Exception as e:
await ctx.send(f"Произошла ошибка при выполнении поиска: {str(e)}")
await search_and_reply(query, ctx)
, но будет брать на себя регистрацию как обработчика команды, проверку ролей и кулдаунов, и прочую мишуру, которой не место внутри search_and_reply(). Тогда ask() может просто сделать аналогичный вызов await search_and_reply(query, channel)
в нужный момент, не беспокоясь о специфике дискорд-обработчика, так как search_and_reply() таковым не является. server.voice.channels
- получить у объекта сервер свойство voice, а у объекта в этом свойстве - свойство channels.spisok = "".join(llavw)
url = "https://file.11klasov.net/index.php?do=download&id=16985" # замените на URL файла, который вы хотите скачать
response = requests.get(url)
response.history
, и ты увидишь там два ответа: [<Response [302]>, <Response [301]>]
. Все коды 3XX - это перенаправления, т.е. сайт тебя перенаправляет на другую страницу, вместо того, чтобы отдать контент.response.url
, который будет равен'https://file.11klasov.net/13938-russkij-jazyk-7-klass-razumovskaja-mm-lvova-si-kapinos-vi-i-dr.html'
response.headers['content-type']
. Он будет 'text/html; charset=utf-8'
, т.е. это HTML страница а не PDF файл. Разумеется, если ты HTML страницу запишешь в файл с расширением .pdf, она от этого не станет валидным PDF.response2 = requests.get(url, headers={
'referer': response.url, # ну или 'https://file.11klasov.net/13938-russkij-jazyk-7-klass-razumovskaja-mm-lvova-si-kapinos-vi-i-dr.html'
})
response2.history
будет пустой, а response2.headers['content-type']
будет равен 'application/pdf'
.member_full = bot.get_user(id=id)
banned_users = await ctx.guild.bans()
for ban in banned_users: ...
member_full = bot.get_user(id=id)
async for ban in ctx.guild.bans(): ...
async for x in y
- это не то же самое, что и for x in await y
. Асинхронный генератор (первый случай) каждый элемент запрашивает асинхронно, а во втором случае - асинхронно запрашивается вся коллекция, которая потом синхронно итерируется. Разные подходы, разные методы, так что объект вполне может поддерживать только один из них. def sum_split(summa: int, candidates: list[int]) -> list[int]:
answer = sum_split(summa - candidates[i], candidates[i+1:])
.