Учебные курсы мехмата ЮФУ
Skip to main content
Search courses
Skip courses
Collapse all
Skip Navigation Skip Контакты
Администратор: И. В. Лошкарёв (ИММиКН, ул. Мильчакова, 8А, а. 210, email: [email protected])
Уважаемые преподаватели! Перед началом курса запускайте его очистку и не забывайте ставить галочку «Удалить все ответы» в разделе Задания
Skip CalendarNo events, Wednesday, 1 February 1 No events, Wednesday, 1 February 1 | No events, Thursday, 2 February 2 No events, Thursday, 2 February 2 | No events, Friday, 3 February 3 No events, Friday, 3 February 3 | No events, Saturday, 4 February 4 No events, Saturday, 4 February 4 | |||
No events, Sunday, 5 February 5 No events, Sunday, 5 February 5 | No events, Monday, 6 February 6 No events, Monday, 6 February 6 | No events, Tuesday, 7 February 7 No events, Tuesday, 7 February 7 | No events, Wednesday, 8 February 8 No events, Wednesday, 8 February 8 | No events, Thursday, 9 February 9 No events, Thursday, 9 February 9 | No events, Friday, 10 February 10 No events, Friday, 10 February 10 | No events, Saturday, 11 February 11 No events, Saturday, 11 February 11 |
No events, Sunday, 12 February 12 No events, Sunday, 12 February 12 | No events, Monday, 13 February 13 No events, Monday, 13 February 13 | No events, Tuesday, 14 February 14 No events, Tuesday, 14 February 14 | No events, Wednesday, 15 February 15 No events, Wednesday, 15 February 15 | No events, Thursday, 16 February 16 No events, Thursday, 16 February 16 | No events, Friday, 17 February 17 No events, Friday, 17 February 17 | No events, Saturday, 18 February
18 No events, Saturday, 18 February 18 |
No events, Sunday, 19 February 19 No events, Sunday, 19 February 19 | No events, Monday, 20 February 20 No events, Monday, 20 February 20 | No events, Tuesday, 21 February 21 No events, Tuesday, 21 February 21 | No events, Wednesday, 22 February 22 No events, Wednesday, 22 February 22 | No events, Thursday, 23 February 23 No events, Thursday, 23 February 23 | No events, Friday, 24 February 24 No events, Friday, 24 February 24 | No events, Saturday, 25 February 25 No events, Saturday, 25 February 25 |
No events, Sunday, 26 February 26 No events, Sunday, 26 February 26 | No events, Monday, 27 February 27 No events, Monday, 27 February 27 | No events, Tuesday, 28 February 28 No events, Tuesday, 28 February 28 |
Первая цифра — уровень:
1 — вводный
2 — основной
3 — специальный
4 — магистерский
Вторая цифра (для уровней 2—4) — шифр области знаний в ФИИТ:
0 — дискретная математика и теоретическая информатика
1 — языки и системы программирования
2 — архитектура компьютера, операционные системы, сети
3 — интерфейсы, графика
4 — алгоритмы и сложность
5 — информационные и интеллектуальные системы
6 — программная инженерия
7 — теория информации и защита информации
8 — непрерывная математика
9 — разное
Третья цифра — номер курса в рамках уровня и области.
Буква (если есть) — указывает, что курс длится несколько семестров.
Ссылка на полный список.
You are not logged in. (Log in)
Data retention summary
Get the mobile app
Урок 5. Клавиатуры и кнопки · Telegram бот на Python 3 и aiogram
В сегодняшнем уроке мы разберём шаблоны сообщений и инлайн-клавиатуры и научимся применять встроенные в aiogram методы для составления сложных клавиатур.
Не забывайте своевременно обновлять библиотеку командой
python3.6 -m pip install aiogram -U
! Урок проводится с использованием версии 1.2.3Весь код, использованный в уроке, как обычно доступен на GitHub
Для начала стоит понять, в чем основное различие
ReplyKeyboardMarkup
и InlineKeyboardMarkup
:ReplyKeyboardMarkup
— это шаблоны сообщений. К примеру, ваш бот задаёт пользователю вопрос и предлагает варианты ответа. Пользователь может самостоятельно напечатать ответ, либо нажать на готовую кнопку. Такая клавиатура показывается вместо основной и не привязана ни к какому сообщению. В кнопки такой клавиатуры нельзя заложить никакой информации, нельзя запрограммировать для неё подобный если пользователь нажимает кнопку с текстом «abc» отправить текст «qwerty» алгоритм, отправлено будет только то, что написано на кнопке (есть два исключения, о которых ниже).
InlineKeyboardMarkup
— это уже настоящая кастомная клавиатура. С её помощью мы можем выполнять более сложные действия. Она привязывается к сообщению, с которым была отправлена. В кнопки можно заложить любой текст размером от 1 до 64 байт (будьте осторожны, недобросовестные клиенты позволяют изменять эти данные). Инлайн кнопки позволяют скрыть в себе внутреннюю телеграм ссылку, ссылку на внешний ресурс, а также шорткат для инлайн запроса (об инлайн режиме в одном из следующих уроков).
И ту и другую клавиатуру можно редактировать, но разными способами. Первая обновляется при отправке сообщения с новой клавиатурой типа ReplyKeyboardMarkup
, вторую можно редактировать вместе с сообщением, к которому она прикреплена (или только саму разметку).
Переходим к коду
Создадим отдельный модуль с клавиатурами, которые будем использовать в основной программе.
В первую очередь импортируем необходимые нам модули и создаём первую клавиатуру:
from aiogram.types import ReplyKeyboardRemove, \ ReplyKeyboardMarkup, KeyboardButton, \ InlineKeyboardMarkup, InlineKeyboardButton button_hi = KeyboardButton('Привет! 👋') greet_kb = ReplyKeyboardMarkup() greet_kb.add(button_hi)
При инициализации класса KeyboardButton
необходимо передать один обязательный параметр — текст, который пользователь будет отправлять по нажатию на эту кнопку. У объекта класса ReplyKeyboardMarkup
есть несколько методов, позволяющих добавить кнопку, в данном случае мы используем add
. Таким образом мы получили первую готовую клавиатуру.
Создаём обработчик, который будет отправлять нам сообщение и наш шаблон (напомню, что отправить отдельно клавиатуру никак нельзя, она является параметром к сообщению).
@dp.message_handler(commands=['start']) async def process_start_command(message: types.Message): await message.reply("Привет!", reply_markup=kb.greet_kb)
Запускаем и проверяем:
Отлично, клавиатура появилась! Но эта одна кнопка с маленьким текстом занимает очень много места. Телеграм позволяет автоматически уменьшить размер, для этого необходимо передать в инициализатор класса ReplyKeyboardMarkup
параметру resize_keyboard
значение True
. Создадим новую клавиатуру:
greet_kb1 = ReplyKeyboardMarkup(resize_keyboard=True).add(button_hi)
Мы передали параметр в инициализатор и следом сразу добавили уже существующую кнопку. Отправляем новую версию клавиатуры:
@dp.message_handler(commands=['hi1']) async def process_hi1_command(message: types. Message): await message.reply("Первое - изменяем размер клавиатуры", reply_markup=kb.greet_kb1)
Очевидно, так как у нас нет обработчика обычных сообщений, текст, отправляемый нажатием на эту кнопку, остаётся без ответа. При желании можно добавить функцию эхо из первого урока. А что ещё можно было заметить при использовании этой кнопки? Что она остаётся всё там же, даже если мы после нажатия хотели бы вернуться к привычной клавиатуре. Да, нажать одну кнопку, чтобы переключиться, не сложно. Но если клавиатура в принципе не подразумевает повторного нажатия прямо сейчас? И для этого тоже есть решение:
# keyboards.py greet_kb2 = ReplyKeyboardMarkup( resize_keyboard=True, one_time_keyboard=True ).add(button_hi) # bot.py @dp.message_handler(commands=['hi2']) async def process_hi2_command(message: types.Message): await message.reply("Второе - прячем клавиатуру после одного нажатия", reply_markup=kb.greet_kb2)
Эти параметры можно комбинировать. Вследствие чего мы получили маленькую клавиатуру, которая скрывается после одной отправки. Но пользователь может снова её открыть нажатием на соответствующую кнопку в поле ввода.
Добавляем больше кнопок
Рассмотрим подробно работу встроенных методов для создания более сложных клавиатур, а именно row
, insert
и add
. Создаём кнопки, которые мы сможем использовать повторно и генерируем несколько разных клавиатур:
button1 = KeyboardButton('1️⃣') button2 = KeyboardButton('2️⃣') button3 = KeyboardButton('3️⃣') markup3 = ReplyKeyboardMarkup().add( button1).add(button2).add(button3) markup4 = ReplyKeyboardMarkup().row( button1, button2, button3 ) markup5 = ReplyKeyboardMarkup().row( button1, button2, button3 ).add(KeyboardButton('Средний ряд')) button4 = KeyboardButton('4️⃣') button5 = KeyboardButton('5️⃣') button6 = KeyboardButton('6️⃣') markup5.row(button4, button5) markup5.insert(button6)
Важно: сейчас мы отталкиваемся от того, что клавиатура по умолчанию имеет 3 кнопки в ряд. О том, как изменить это значение, будет в примере с инлайн клавиатурами — этот параметр идентичен для обоих видов.
- Метод
add
принимает в себя любое количество кнопок, всегда начинает добавление с новой строки и переносит ряд при достижении значения установленной ширины. - Метод
row
тоже принимает любое количество, но при этом не переносит кнопки на новый ряд, а добавляет всё полученное в одну строчку. - Метод
insert
работает по схеме схожей сadd
, но только начинает добавлять к последнему ряду. И только если там уже достигнута максимальная ширина, начинает новую строку. Взглянем на него ещё раз при создании следующей клавиатуры.
Отправляем все готовые кнопки и смотрим на результат:
@dp.message_handler(commands=['hi3']) async def process_hi3_command(message: types.Message): await message.reply("Третье - добавляем больше кнопок", reply_markup=kb.markup3)
@dp.message_handler(commands=['hi4']) async def process_hi4_command(message: types. Message): await message.reply("Четвертое - расставляем кнопки в ряд", reply_markup=kb.markup4)
@dp.message_handler(commands=['hi5']) async def process_hi5_command(message: types.Message): await message.reply("Пятое - добавляем ряды кнопок", reply_markup=kb.markup5)
Думаю, здесь достаточно наглядно видно работу методов добавления кнопок в разметку.
И последнее по этому виду клавиатур. ReplyKeyboardMarkup
позволяет запросить у пользователя его контакт или локацию. Это те самые два исключения из правила, когда при нажатии кнопки будет отправлено не то, что написано на ней. Их можно отправлять как по одной, так и в составе более сложной клавиатуры. Добавим обе кнопки и посмотрим, что будет (обращу внимание читателя на то, что нельзя одной кнопкой запросить сразу и то и то):
# keyboards.py markup_request = ReplyKeyboardMarkup(resize_keyboard=True).add( KeyboardButton('Отправить свой контакт ☎️', request_contact=True) ). add( KeyboardButton('Отправить свою локацию 🗺️', request_location=True) ) #bot.py @dp.message_handler(commands=['hi6']) async def process_hi6_command(message: types.Message): await message.reply("Шестое - запрашиваем контакт и геолокацию\nЭти две кнопки не зависят друг от друга", reply_markup=kb.markup_request)
При нажатии на каждую из этих кнопок клиент (приложение Телеграм) спросит, уверены ли вы, что хотите поделиться с ботом этими данными и при утвердительном ответе отправит их.
Рассмотрим подробнее последний метод для составления клавиатур — insert
. Он похож на метод add
, но начинает добавлять кнопки не с нового ряда, а сначала проверяет, заполнен ли до конца последний ряд. И если нет, то сначала добавляет кнопки туда, а переносит строку только при достижении указанного лимита.
# keyboards.py markup_big = ReplyKeyboardMarkup() markup_big.add( button1, button2, button3, button4, button5, button6 ) markup_big. row( button1, button2, button3, button4, button5, button6 ) markup_big.row(button4, button2) markup_big.add(button3, button2) markup_big.insert(button1) markup_big.insert(button6) markup_big.insert(KeyboardButton('9️⃣')) # bot.py @dp.message_handler(commands=['hi7']) async def process_hi7_command(message: types.Message): await message.reply("Седьмое - все методы вместе", reply_markup=kb.markup_big)
После каждой отправки ботом пользователю клавиатуры, последняя заменяет предыдущую. Поэтому пользователь всегда может открыть её, даже когда по контексту она не нужна. Для того, чтобы у пользователя в клиенте клавиатура убралась совсем, нужно отправить ему ReplyKeboardRemove
:
@dp.message_handler(commands=['rm']) async def process_rm_command(message: types.Message): await message.reply("Убираем шаблоны сообщений", reply_markup=kb.ReplyKeyboardRemove())
Получив сообщение с такой клавиатурой, клиент уберёт шаблоны полностью.
Инлайн клавиатуры
Теперь перейдем к инлайн клавиатурам. Они имеют больше параметров, поэтому позволяют нам делать больше разных вещей. Самое популярное использование — как кнопка, являющаяся шорткатом для какого-то действия. То есть «если пользователь нажал кнопку X, сделать Y». И под Y можно понимать вообще что угодно, так как это уже не ограничивается даже API. Рассмотрим наглядно, для этого передадим в инициализатор значение callback_data
:
# keyboards.py inline_btn_1 = InlineKeyboardButton('Первая кнопка!', callback_data='button1') inline_kb1 = InlineKeyboardMarkup().add(inline_btn_1) #bot.py @dp.message_handler(commands=['1']) async def process_command_1(message: types.Message): await message.reply("Первая инлайн кнопка", reply_markup=kb.inline_kb1)
Нажимаем кнопку и.. ничего не происходит! Почему? Если у бота было включено логгирование, то вы могли заметить, что приходит обновление типа CallbackQuery
. Так вот именно его нам и нужно отлавливать. Добавляем нужный хэндлер (я предпочитаю ставить их выше, но относительно хэндлеров обычных сообщений значения это не имеет):
@dp.callback_query_handler(func=lambda c: c.data == 'button1') async def process_callback_button1(callback_query: types.CallbackQuery): await bot.answer_callback_query(callback_query.id) await bot.send_message(callback_query.from_user.id, 'Нажата первая кнопка!')
Здесь мы делаем проверку прямо в хэндлере. Аргумент func
ожидает функцию, которая принимает один параметр (туда передаётся апдейт), и хэндлер срабатывает, если возвращается истина. Этот аргумент можно использовать и в других хэндлерах, мы уже использовали его в уроке по FSM.
Внутри мы можем делать вообще что угодно, так как работаем с обычным питоном. Подача корма для кошки? Управление светом? Пределом является только ваша фантазия.
Хорошим тоном будет отвечать на все колбеки — для этого есть метод answerCallbackQuery
. В документации сказано, что ответ ожидается клиентом, и дать его нужно обязательно, даже если вы не собираетесь передавать что-либо. Этого времени предостаточно, чтобы собрать необходимые данные и прислать их. При этом во время ожидания на кнопке будут крутиться часики, показывающие, то клиент ждёт ответа, поэтому если мы не хотим, чтобы пользователь наблюдал их, то нужно не забывать отвечать. Обязательный аргумент — айди запроса, на который мы отвечаем. Остальные параметры рассмотрим ниже. А в данном случае мы для наглядности отправим сообщение с информацией о том, что нажата первая кнопка. Запускаем снова, жмём кнопку и таки получаем ответ:
В этот раз установим ширину клавиатуры 2 и посмотрим, что будет.
Ну и так как методы добавления новых элементов мы уже разобрали, добавим сразу все доступные кнопки и отправим получившуюся клавиатуру, не забыв добавить хэндлер кнопок:
# keyboards.py inline_kb_full = InlineKeyboardMarkup(row_width=2).add(inline_btn_1) inline_kb_full.add(InlineKeyboardButton('Вторая кнопка', callback_data='btn2')) inline_btn_3 = InlineKeyboardButton('кнопка 3', callback_data='btn3') inline_btn_4 = InlineKeyboardButton('кнопка 4', callback_data='btn4') inline_btn_5 = InlineKeyboardButton('кнопка 5', callback_data='btn5') inline_kb_full. add(inline_btn_3, inline_btn_4, inline_btn_5) inline_kb_full.row(inline_btn_3, inline_btn_4, inline_btn_5) inline_kb_full.insert(InlineKeyboardButton("query=''", switch_inline_query='')) inline_kb_full.insert(InlineKeyboardButton("query='qwerty'", switch_inline_query='qwerty')) inline_kb_full.insert(InlineKeyboardButton("Inline в этом же чате", switch_inline_query_current_chat='wasd')) inline_kb_full.add(InlineKeyboardButton('Уроки aiogram', url='https://surik00.gitbooks.io/aiogram-lessons/content/')) # bot.py @dp.callback_query_handler(func=lambda c: c.data and c.data.startswith('btn')) async def process_callback_kb1btn1(callback_query: types.CallbackQuery): code = callback_query.data[-1] if code.isdigit(): code = int(code) if code == 2: await bot.answer_callback_query(callback_query.id, text='Нажата вторая кнопка') elif code == 5: await bot.answer_callback_query( callback_query.id, text='Нажата кнопка с номером 5.\nА этот текст может быть длиной до 200 символов 😉', show_alert=True) else: await bot. answer_callback_query(callback_query.id) await bot.send_message(callback_query.from_user.id, f'Нажата инлайн кнопка! code={code}') @dp.message_handler(commands=['2']) async def process_command_2(message: types.Message): await message.reply("Отправляю все возможные кнопки", reply_markup=kb.inline_kb_full)
Пройдёмся по строчкам по порядку, чтобы не осталось вопросов:
- мы создаём клавиатуру типа
InlineKeyboardMarkup
, указываем, что ширина строки должна быть не больше двух (напомню, что это не распространяется на методrow
) и сразу добавляем туда уже готовую кнопку - далее добавляем кнопку, у которой указываем другие данные в параметре
callback_data
- следом генерируем три новые кнопки и добавляем их дважды. Сначала методом
add
, затем черезrow
. И так как ширина клавиатуры равна двум, то в первом случае происходит перенос третьей кнопки, во втором случае нет - затем добавляем кнопки, у которых указываем уже не
callback_data
, а другие параметры. То, что мы добавим вswitch_inline_query
, будет автоматически использовано при нажатии кнопки: пользователю предложат выбрать чат, а там вызовется инлайн режим этого бота (в поле ввода сообщения добавится юзернейм бота), следом через пробел будет прописано то, что мы указали. Параметр может принимать пустую строку, тогда инлайн режим запустится без какого-либо запроса, но если будет указан текст, то он и добавится - при использовании
switch_inline_query_current_chat
произойдёт ровно то же, что и в предыдущем пункте, но без выбора чата, а запустится в текущем (было сложно догадаться по названию, я знаю) - ну и последний параметр
url
— добавляем ссылку на внешний ресурс, либо диплинк в самом Телеграме
Так как параметр клавиатуры row_width
равен двум, то кнопки автоматически расставились соответствующе.
Рассмотрим реакцию на кнопки по порядку:
При нажатии первой срабатывает наш первый колбек, так как не важно, в какую клавиатуру добавлена кнопка, важно, какая у неё callback_data
☝️. Поэтому добавлять инлайн кнопку можно сколько угодно раз в любые инлайн клавиатуры.
Кнопки со второй по пятую имеют схожую структуру в callback_data
, поэтому внутри хэндлера проверяем, какой код у нажатой кнопки и:
- если 2, то отвечаем на запрос и передаем информационное сообщение. Аргумент
text
это текст ответа на запрос. По умолчанию он будет показан вверху чата и сам скроется через пару секунд. - если 5, то отвечаем так же, но указываем
show_alert=True
, таким образом мы сообщаем клиенту, что нужно показать окошко с текстом - в ином случае просто отвечаем на колбек
И во всех случаях шлем сообщение пользователю:
Ещё можно отправить кнопку с игрой или платежом, но первое мы разберем в одном из следующих уроков, а о втором я уже упоминал в одном из предыдущих.
При ответе на колбек можно ещё передать в ответ ссылку формата t.me/your_bot?start=XXXX
, чтобы пользователь запустил вашего бота с определенным параметром, но диплинкинг мы тоже оставим для другого урока, так как здесь только о кнопках.
На последок не забываем добавить обработку команы /help
и запускаем:
help_message = text( "Это урок по клавиатурам.", "Доступные команды:\n", "/start - приветствие", "\nШаблоны клавиатур:", "/hi1 - авто размер", "/hi2 - скрыть после нажатия", "/hi3 - больше кнопок", "/hi4 - кнопки в ряд", "/hi5 - больше рядов", "/hi6 - запрос локации и номера телефона", "/hi7 - все методы" "/rm - убрать шаблоны", "\nИнлайн клавиатуры:", "/1 - первая кнопка", "/2 - сразу много кнопок", sep="\n" ) @dp.message_handler(commands=['help']) async def process_help_command(message: types.Message): await message.reply(help_message) if __name__ == '__main__': executor.start_polling(dp)
Вот и всё!
В этом уроке мы разобрали как работать с клавиатурами в Телеграм
Документация JDK 19 — Главная
- Главная
- Ява
- Java SE
- 19
Обзор
- Прочтите меня
- Примечания к выпуску
- Что нового
- Руководство по миграции
- Загрузить JDK
- Руководство по установке
- Формат строки версии
Инструменты
- Технические характеристики инструментов JDK
- Руководство пользователя JShell
- Руководство по JavaDoc
- Руководство пользователя средства упаковки
Язык и библиотеки
- Обновления языка
- Основные библиотеки
- HTTP-клиент JDK
- Учебники по Java
- Модульный JDK
- Руководство программиста API бортового регистратора
- Руководство по интернационализации
Технические характеристики
- Документация API
- Язык и ВМ
- Имена стандартных алгоритмов безопасности Java
- банок
- Собственный интерфейс Java (JNI)
- Инструментальный интерфейс JVM (JVM TI)
- Сериализация
- Проводной протокол отладки Java (JDWP)
- Спецификация комментариев к документации для стандартного доклета
- Прочие характеристики
Безопасность
- Руководство по безопасному кодированию
- Руководство по безопасности
Виртуальная машина HotSpot
- Руководство по виртуальной машине Java
- Настройка сборки мусора
Управление и устранение неполадок
- Руководство по устранению неполадок
- Руководство по мониторингу и управлению
- Руководство по JMX
Client Technologies
- Руководство по специальным возможностям Java
5 способов замены нескольких символов в строке в Python
Знаете ли вы, что строки являются неизменяемыми объектами в Python? Их значения, однажды объявленные, не могут быть изменены. Отсюда возникла необходимость использовать различные функции для работы со строками. В этой статье мы узнаем, как заменить несколько символов в строке в Python.
Прежде чем двигаться дальше, давайте немного освежим в памяти строки:
Что такое строки?В Python все является объектом. Строки также являются объектами Python, но обычно они определяются как последовательность символов, заключенная в кавычки ( либо ‘ ‘, либо » » ). Этими символами могут быть a–z, A–Z, 0–9 или специальные символы (например, $, %) и пробелы (‘ ‘).
Что вы подразумеваете под заменой нескольких символов в строке?При решении проблем часто возникает необходимость заменить несколько символов (может быть, один или несколько) в строке. Но вопрос в том, что вы понимаете под заменой нескольких символов в строке?
Над строками можно выполнять множество операций. Но когда мы говорим «замена символов в строке в Python», на ум приходят следующие случаи:
- Замена символа в строке другим символом. Например, у нас есть строка » Favtutor «, и мы хотим заменить первое вхождение ‘t’ на ‘T’. Теперь, поскольку мы заменяем ‘t’ только другим ‘T’, это называется заменой одного символа в строке.
- Замена всех вхождений символа в строке другим символом. Возьмем приведенный выше пример, скажем, вы хотите заменить оба вхождения «t» в строке « Favtutor » на «T». В результате получится строка: « FavTuTor «. Следовательно, это заменяет все вхождения символа в строку. (Вы всегда можете указать количество вхождений этого символа, который вы хотите заменить).
- Замена нескольких символов в строке символом ‘ тот же ‘. Например, у вас есть строка « Hello world », и вы хотите заменить символы, скажем, « l » и « o », на другой символ, например «!». В результате получится: « He!!! W!r!d «. Это пример замены нескольких символов в строке одним (таким же) символом.
- Замена нескольких символов в строке другими символами (разными). Например, возьмем утверждение «Строки неизменяемы». Вам нужно заменить символы, скажем [‘r’, ‘m’, ‘i’], на, допустим [‘R’, ‘!’, ‘M’], в соответствующем порядке, т.е. ‘r’ заменено на «R», «M» заменено на «!» и «я» заменено на «М». Следовательно, это приведет к «StRMngs aRe M!!utable». Иногда эту группу из нескольких символов также можно назвать « SubStrings ».
- Удаление символов в строке. Например, рассмотрим строку «Любимый репетитор». Теперь предположим, что вам нужно удалить пробел (‘ ‘) между «Fav» и «Tutor». Вы можете удалить это пустое место, заменив его на («»). Следовательно, вывод здесь будет: «FavTutor».
Здесь вы можете узнать, как удалить пробелы из строки в Python.
Вам должно быть интересно, как мы можем вносить изменения (в данном случае заменять символы) в строках. Строки неизменяемы, не так ли?
Ну, строки неизменяемы! Методы (вы их скоро узнаете) принимают исходную строку в качестве входных данных и возвращают измененную (после замены символов) строку в качестве выходных данных. Этот вывод сохраняется в другой строковой переменной. Следовательно, нам нужна еще одна переменная (строковый объект) для хранения полученных результатов. Таким образом, в исходную строку не вносятся никакие изменения, сохраняя ее неизменное свойство.
Как заменить несколько символов в строке в Python?Python предлагает различные модули и методы для замены нескольких символов в строке. Теперь эти несколько символов могут быть либо по отдельности, либо вместе как «слово» . Хотя мы сосредоточены на замене нескольких символов, эти методы также можно применять для замены одного символа в строке в Python.
Начнем!
01) Использование метода replace()Python предлагает метод replace() для замены символов (одиночных или нескольких) в строке. Метод replace возвращает новый объект (строку), заменяя указанные поля (символы) новыми значениями.
Метод replace() принимает в качестве входных данных два параметра: первый — это шаблон, который вы хотите (сопоставить в строке) для замены, а второй параметр — это шаблон (символ), который вы хотите заменить.
Наиболее часто используемый синтаксис для replace():
newObject = originalString.replace(‘символ для замены’, ‘символ для замены’ )
Рассмотрим пример:
# Использование метода replace() строка = "Жвачка" # замена символа 'b' на 'B' измененная_строка = строка.заменить ("б", "б") print("Исходная строка: ", строка) print("Новая строка: ", измененная_строка)
Результат:
Исходная строка: Bubblegum Новая строка: BuBBlegum
Обратите внимание, как буквы «b» в исходной строке «Bubblegum» заменены на «B». Это пример замены нескольких вхождений одного символа в строку.
Метод replace() также имеет третий параметр (необязательный), в котором вы можете указать количество замен, которые вы хотите выполнить.
То есть, если в каком-либо слове, например, «Bubblegum» есть более одного вхождения символа, здесь ‘b’, то мы можем ввести третий параметр как 1, если нам нужно заменить только один ‘b’ из строки.
Следовательно, основной синтаксис метода replace():
newObject = originalString.replace(‘символ для замены’, ‘символ для замены, количество замен для выполнения)
Давайте посмотрим на код для этого примера:
# Использование метода replace() строка = "Жвачка" # замена символа 'b' на 'B' измененная_строка = строка.заменить ("б", "б", 1) print("Исходная строка: ", строка) print("Новая строка: ", измененная_строка)
По умолчанию в строке заменяются все вхождения первого параметра.
Результат:
Исходная строка: Bubblegum Новая строка: BuBblegum
Обратите внимание, что только первое вхождение «b» было заменено на «B». Это произошло из-за того, что количество выполняемых замен было установлено равным 1.
02) Использование replace() со спискамиВ приведенном выше методе мы видели использование метода replace() для замены отдельных символов (одиночных или больше вхождений) с другим символом. Метод replace() также можно использовать для замены нескольких (разных) символов другим (таким же или другим для каждого) символом.
Использование цикла for: Самый распространенный способ работы со списками — использование цикла for. Чтобы заменить несколько символов (скажем, разных) с помощью метода replace(), вы можете перечислить все символы, которые нужно удалить, в списке.
Пример объявления списка:
# несколько символов для замены string = "Блог FavTutor: как удалить несколько символов в строке в Python" # допустим нам нужно заменить символы - 't', 'l', 'r' # создание списка заменяемых символов char_remov = ['т', 'л', 'р']
Вам может быть интересно, зачем мы создаем список или даже используем цикл for, когда мы можем напрямую вызывать replace() для каждого из символов.
Довольно просто, правда?
Нет, это не так. Вы найдете причину позже в блоге. (Так что следите за этим!)
После инициализации списка вы можете заменить упомянутые символы одним и тем же символом (т. е. все по одному) или несколькими символами (т. е. разными символами для каждого).
Случай: Замена нескольких символов одним и тем же символом:
# несколько символов для замены string = "Блог FavTutor: как удалить несколько символов в строке в Python" # допустим нам нужно заменить символы - 't', 'l', 'r' # создание списка заменяемых символов char_remov = ["т", "л", "р"] print("Исходная строка: " + строка) # допустим, нам нужно заменить их специальным символом '#' # Использование цикла for для каждого символа char_remov для char в char_remov: # replace() "возвращает" измененную строку строка = строка.заменить (символ, "#") print("Измененная строка: " + строка)
Вы заметите, как я использовал цикл for, чтобы проанализировать строку для «каждого символа» в списке, чтобы заменить его другим символом (например, «#»).
Вывод:
Исходная строка: Блог FavTutor: Как удалить несколько символов в строке в Python Измененная строка: FavTu#o# B#og: Как #o Удалить mu##ip#e cha#ac#e#s в s##ing в Py#hon
Еще раз обратите внимание, что мы заменили заменяемые символы (элементы в списке char_remov) тем же символом (‘#’), что и выше.
03) Использование replace() со словаремМы также можем использовать разные символы для каждого заменяемого символа. Для того, чтобы добиться этого, вы должны знать о словарях!
Что такое словарь в Python? a Словарь – это набор пар ключ-значение. Это еще один тип данных, предлагаемый Python, который также считается реализацией Python ассоциативной структуры данных массива. Они изменяемы и не допускают дублирования, поскольку ключ может иметь только одно значение.
Словарь представлен: {}.
Пример словаря можно увидеть так:
# пример объявления словаря # словарь = {'ключ': значение} # способ 1 словарь = {"FavTutor": "блоги", "язык": "Python"} # доступ к значениям словаря значение1 = словарь.получить("FavTutor") print("Значения: ", value1," in ", Dictionary.get("язык"))
Выше приведен один из способов объявления словаря. Также показан один из подходов к получению значений с помощью ключей.
Вывод:
Значения: блоги на Python
Теперь, когда вы знаете, что такое словарь и как им пользоваться, давайте вернемся к замене символов в строке. Давайте рассмотрим тот же пример, что и раньше, но вместо этого заменим каждый символ другим символом. (Давайте попробуем заменить их заглавными буквами. Это будет легко заметить.)
Случай: Замена нескольких символов разными символами в строке в Python
# несколько заменяемых символов string = "Блог Favtutor: как удалить несколько символов в строке в Python" # символы для замены - 't', 'l', 'r', 's' # символы для замены на -'T', 'L', 'R', 'S' print("Исходная строка: ", строка) """ создание словаря для замены символов key - заменяемый символ value - символ для замены на """ to_remov = {"t": "T", "l": "L", "r": "R", "s": "S"} # .keys() возвращает список всех ключей в словаре для char в to_remov.keys(): #dictionName[keys] - еще один способ получить значение строка = строка. заменить (символ, to_remov [символ]) print("Измененная строка: " + строка)
Использование словаря упрощает замену каждого символа на другой с помощью пары ключ-значение. Хотя вы можете использовать словарь для замены нескольких символов одним символом, его использование не рекомендуется (поскольку в этом нет необходимости).
Вывод:
Исходная строка: Блог Favtutor: Как удалить несколько символов в строке в Python Измененная строка: блог FavTuToR: как удалить несколько символов в строке в Python
Надеюсь, вы нашли ответ на наш вопрос: «Зачем нам нужно использовать цикл?»
Так как нам нужно заменить несколько символов в строке, необходимость в цикле очевидна. Мы можем вызвать метод replace() для удаления каждого символа, но как долго вы собираетесь повторять этот процесс? А в случае большого количества заменяемых символов вызов replace() для каждого символа не только увеличивает длину вашего кода, но и ухудшает его читабельность.
Кроме того, сложнее отслеживать длинный список заменяемых символов. Следовательно, перечислив (или создав словарь) заменяемые символы, нам легко завершить длительный повторяющийся процесс с помощью цикла.
Имейте это в виду. Это довольно просто, но может часто встречаться в интервью!
Метод replace() является наиболее распространенным методом замены любого символа в строке. Вы можете использовать любую из приведенных выше версий для замены нескольких символов в строке в Python. Существуют специальные символы (например, «|»), которые также можно использовать с выражениями. Такое использование специальных символов или шаблонов для замены используется в регулярных выражениях (или RegEx).
04) Использование модуля rePython предлагает модуль re для упрощения работы с регулярными выражениями. Вы должны знать, что регулярные выражения представляют собой последовательность символов, которая образует шаблон поиска. Следовательно, регулярных выражений в основном представляют собой строки . Вы также можете заменить несколько символов в строке с помощью модуля re.
Существует два основных способа замены символов:
- Использование функции sub() с метасимволами или специальной последовательностью
- Использование функции sub() со списками и словарями
Прежде чем перейти к этим методам, давайте узнаем о функции sub().
Функция sub() в модуле re: Модуль re в Python предлагает функцию sub(), которая заменяет соответствующий символ (символ, заданный в строке) заданным (новым) символом. Это возвращает строку с новыми символами на месте. Обратите внимание, что вам нужно импортировать модуль re , чтобы использовать функцию sub().
Основной синтаксис для функции sub():
newString = re.sub( ‘characterToBeReplaced’, ‘characterToReplaceWith’, stringName )
Давайте рассмотрим пример, чтобы понять, как работает функция sub():
Случай: замена одного символа другим символом в строке
# импорт модуля регулярного выражения импортировать повторно строка = "Фавтутор" print("Исходная строка: ", строка) """Заменяемый символ = 't', символ для замены на = 't'. """ # вызов функции sub() newString = re.sub("t", "T", строка) print("Новая строка: ", newString)
‘t’ здесь также считается регулярным выражением. Также обратите внимание, что, в отличие от метода replace(), имя строки передается в качестве входного параметра подфункции.
Вывод:
Исходная строка: Favtutor Новая строка: FavTuTor
Функция sub() ищет в строке шаблон (символ), а затем заменяет совпадение (шаблон) новым символом. Он возвращает новую строку с внесенными изменениями. Обратите внимание, что вы также можете указать количество замен, которые должны произойти, передав » count » параметр в конце. Следовательно, основной синтаксис подпрограммы будет таким:
newString = re.sub(‘charactersToBeReplaced’, ‘characterToReplaceWith’ , stringName, count )
Теперь перейдем к замене несколько символов, используя функцию sub(), с помощью специальных символов!
Помните, что метасимволы – это символы со специальным значением (например, | для ‘либо-либо’) и специальные последовательности, такие как ‘\s’ для пробелов. Эти метасимволы или специальные последовательности можно использовать для замены нескольких символов в строке.0119
Обратите внимание на приведенный ниже пример:
Случай: замена нескольких символов в строке одним символом с использованием специальной последовательности и метасимволов
# импорт модуля регулярных выражений импортировать повторно # несколько символов для замены string = "Хозяин всего не является хозяином ничего" print("Исходная строка: ", строка) # допустим - заменяемые символы - 'm', 'n' и пробелы # символ для замены на '#' # вызов функции sub() # пробел, представленный специальной последовательностью - '\s' # '|' используется либо для либо строка = re.sub("m|n|\s", "#", строка) print("Новая строка: ", строка)
Обратите внимание, что в приведенном выше примере я использовал специальную последовательность (‘\s’), а также метасимвол (‘|’).
Выходные данные:
Исходная строка: Мастер всего не является мастером ничего Новая строка: A##aster#of#all#is#a##aster#of##o#e
Это еще один способ замены нескольких символов с помощью функции sub(). Но этот способ можно использовать до тех пор, пока количество заменяемых символов не будет ограничено несколькими. Как и раньше, нам нужно будет использовать цикл, чтобы работать с заменой нескольких символов (больше нескольких). Функцию sub() также можно использовать со списками и словарями.
Давайте рассмотрим пример использования функции sub() со словарем:
Случай: замена нескольких символов в строке разными символами с использованием словаря
# импорт модуля регулярных выражений импортировать повторно # несколько символов для замены string = "Блог Favtutor: как удалить несколько символов в строке в Python" # символы для замены - 't', 'l', 'r', 's' # символы для замены на -'T', 'L', 'R', 'S' print("Исходная строка: ", строка) """ создание словаря для замены символов key - заменяемый символ value - символ для замены на """ to_remov = {"t": "T", "l": "L", "r": "R", "s": "S"} # .keys() возвращает список всех ключей в словаре для char в to_remov. keys(): #dictionName[keys] - еще один способ получить значение # вызов подфункции модуля re строка = re.sub (char, to_remov [char], строка) print("Измененная строка: " + строка)
Последовательность символов (на которую ссылаются имена переменных ‘char’ и значения в словаре) представляет собой регулярные выражения.
Вывод:
Исходная строка: Блог Favtutor: Как удалить несколько символов в строке в Python Измененная строка: блог FavTuToR: как удалить несколько символов в строке в Python
Помимо функции sub() модуль re также предлагает функцию subn(), аналогичную функции sub(). Единственное отличие состоит в том, что функция subn() также предоставляет количество замен, сделанных ею в строке. Кроме того, функцию sub() также можно использовать с » lambda «.
Вам следует попробовать использовать указанные выше функции. Возможно, они помогут вам получить желаемый результат.
может использоваться со списками и словарями. Однако Python предлагает другой метод, который использует словари для сопоставления старых значений с новыми значениями и, следовательно, для замены нескольких символов в строке.Метод maketrans() создает таблицу сопоставления (словарь) между исходным персонажем и его заменой. См. пример ниже:
# исходная строка string = "Привет, меня зовут Мрадула Миттал. Я энтузиаст машинного обучения." # вызов метода maketrans() # замена «ми» на «ми» transTable = string.maketrans("ми", "МИ") # распечатка вывода, возвращаемого maketrans() печать (транстаблица)
Метод maketrans() создает таблицу (словарь), сопоставляющую старые значения с новыми значениями.
Выход:
{109:77, 105:73}
Обратите внимание, что словарь (возвращенный maketrans()) содержит значения ASCII символов (как заменяемых, так и заменяемых).
Функция translate() принимает таблицу, созданную функцией maketrans(), и генерирует переведенную строку . Взгляните на приведенный ниже пример замены нескольких символов в строке в Python:
# исходная строка string = "Привет, меня зовут Мрадула Миттал. Я энтузиаст машинного обучения." # вызов метода maketrans() # замена «ми» на «ми» translateTable = string.maketrans ("ми", "МИ") вывод = string.translate (translateTable) print("Исходная строка: ", строка) печать('Вывод:', вывод)
Вывод:
Исходная строка: Привет, меня зовут Мрадула Миттал. я энтузиаст машинного обучения. Выход: ПРИВЕТ, Меня зовут Мрадула Миттал. Я энтузиаст машинного обучения.
Это еще один пример замены нескольких символов в строке с помощью словаря. Вы можете использовать вышеуказанный метод для любого из упомянутых выше случаев.
Сравнение методов translate() и replace()Метод translate() и replace(), оба являются встроенными функциями в Python, для замены нескольких символов в строке. Вы можете использовать любой из них для выполнения задачи. Вот сравнение обоих методов:
1. Метод translate() заменяет только отдельные символы произвольными строками, тогда как метод replace() позволяет заменять строки произвольной длины. Например:
# исходная строка string = "Привет, меня зовут Мрадула Миттал. Я энтузиаст машинного обучения." # вызов метода maketrans() # замена 'mit' на 'MI' translateTable = string.maketrans("mit", "MI") вывод = string.translate (translateTable) print("Исходная строка: ", строка) печать("Вывод: ", вывод)
Вывод:
Трассировка (последний последний вызов): Файл ".\temp.py", строка 5, вtranslateTable = string.maketrans("mit", "MI") ValueError: первые два аргумента maketrans должны иметь одинаковую длину
Обратите внимание на ошибку, возникающую при вызове метода maketrans(). Эта ошибка возникла из-за разницы в длине заменяемых символов (или количества символов) и заменяемых символов. Теперь давайте посмотрим, как метод replace() работает с регистром:
# исходная строка string = "Привет, меня зовут Мрадула Миттал. Я энтузиаст машинного обучения." # вызов метода maketrans() # замена 'mit' на 'MI' вывод = строка.заменить ("мит", "М") print("Исходная строка: ", строка) печать("Вывод: ", вывод)
Метод replace() обрабатывает входной параметр ‘mit’ как строку в целом, а не как последовательность отдельных символов. Кроме того, произвольная длина параметров не обязательно должна быть одинаковой.
Вывод:
Исходная строка: Привет, меня зовут Мрадула Миттал. я энтузиаст машинного обучения. Результат: Привет, меня зовут Мрадула Мтал. я энтузиаст машинного обучения.
Следовательно, вы заметите, что вместо замены «m», «i», «t» метод replace() заменяет только комбинацию «mit» с «M».
2. Метод translate() может выполнять замену «нескольких символов» за один вызов, в то время как метод replace() может заменять только «одну строку» за один раз.
3. Метод translate() можно использовать, если вы не уверены, заменяются ли новые символы (символы, которые необходимо заменить).
Трудно? Не волнуйтесь, давайте рассмотрим пример, чтобы понять приведенные выше сравнения.
Например, рассмотрим строку, скажем, ‘abcd’. Теперь вам нужно заменить символы «a» на «b», «b» на «c» и «c» на «d».
Короче говоря, ввод = ‘abcd’ и ожидаемый вывод = ‘bcdd’
Давайте сравним оба метода на приведенном выше вводе:
# исходная строка оригинал = "abcd" # замена 'a' -> 'b', 'b' -> 'c', 'c' -> 'd' # вызов метода maketrans() translateTable = original.maketrans("abc", "bcd") вывод = original.translate(translateTable) print("Исходная строка: ", оригинал) print("Использование метода translate() - Вывод: ", вывод) # вызов метода replace()
# использование вложенного метода replace вывод = original.replace('a', 'b').replace('b', 'c').replace('c', 'd') # это похоже на использование цикла for print("Исходная строка: ", оригинал) print("Использование метода replace() - Вывод: ", вывод)
Обратите внимание на разницу между результатами, возвращаемыми обоими методами.