Решён
Парсинг строк: как получить остаток текста сообщения в сценарии?

Иван LLM Python
2.8k
6

Начальство спустило задачу переписать старого бота для поддержки на питоне. Там ужасный легаси код.

Прилетает сообщение от пользователя, например /ticket 145 не работает принтер. Мне нужно вытащить команду, ID тикета (145) и саму причину. Я могу разбить через split(), но как получить остаток текста сообщения в сценарии целиком? То есть фразу "не работает принтер" со всеми пробелами внутри?

Решение
94
Эксперт • 1 ответ

В Python это делается элегантно через параметр maxsplit.

text = "/ticket 145 не работает принтер"
cmd, ticket_id, reason = text.split(maxsplit=2)

Таким образом в переменной reason окажется весь остаток строки со всеми оригинальными пробелами. А если пользователь не передаст причину, скрипт просто выкинет исключение ValueError, которое удобно перехватить.

Аватар Иван LLM

Отлично, это именно то, что нужно. Спасибо!

0
Участник • 1 ответ

Во-первых, нужно уточнять, какую библиотеку вы используете для бота. Во-вторых, правильнее применять регулярные выражения, а не метод сплит, это надёжнее и исключает ошибки при лишних пробелах.

18
Участник • 1 ответ

Резать строки руками - путь в никуда. Напиши нормальный парсер на Pydantic. Создай модель команды, валидируй тикет на integer, а остаток загоняй в строковое поле. Потом скажешь спасибо когда логика усложнится.

0
Участник • 4 ответа

Просто замени команду на пустую строку через replace.

reason = text.replace('/ticket 145 ', '')

Костыль, но сработает если айдишник уже известен.

0
Эксперт • 1 ответ

Можно просто срезать по индексам. reason = text[12:]. Главное посчитать сколько символов занимает команда с айдишником.

Аватар Рома Лейбл

Айдишник может быть любой длины, срез по индексу сломает данные.

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.