Как сделать проверку if else по определённому шаблону?
Всем доброй ночи, подскажите как правильно сделать проверку if else, введённого текста пользователем по моему шаблону.
await message.answer(text='Укажите время по примеру ниже\nНапример (с 21:30 24.11.2022 по 21:40 24.11.2022)')
await state.set_state(registration_of_the_application.first_time_last.state)
@dp.message_handler(state=registration_of_the_application.first_time_last)
async def first_time_last(message: types.Message, state: FSMContext):
await state.update_data(first_time_last=message.text)
Мне нужно что бы в хендлере:
@dp.message_handler(state=registration_of_the_application.first_time_last)
Была проверка по шаблону с 21:30 24.11.2022 по 21:40 24.11.2022 где цифры могут быть любые, но порядок записи такой с : . . по : . . (то есть эти символы вместе с(с, по) должны быть в таком порядке, а цифры уже могут быть любые).Помогите пожалуйста реализовать данную проверку, буду благодарен за помощь. P.S: Всем добра!
Ответы (1 шт):
У message_handler есть аргумент regexp, который работает как text, только ловит регулярное выражение. Регулярное выражение — мини-язык, который позволит тебе искать подстроки в тексте. То есть по какому-то шаблону ты сможешь искать совпадения в своем тексте, строке. В твоем случае самое простое это такое выражение
pattern=r"^с \d{2}:\d{2} \d{2}\.\d{2}\.\d{4} по \d{2}:\d{2} \d{2}\.\d{2}\.\d{4}$"
и передать его в regexp=pattern Это шаблон без проверки на валидность дней, месяцев и всего прочего. В качестве домашнего задания по регулярным выражениям попробуй написать с проверкой. И вообще советую ознакомиться с регулярками, поскольку эта вещь очень нужная, порешай задачи на эту тему
Пример про аргумент regexp в message_handler: https://github.com/aiogram/aiogram/discussions/581
upd. если посмеяться над здравым смыслом, то тебе нужно ловить фиксированный шаблон, а значит можно проверять посимвольно. насколько я помню, в message_handler можно передавать функцию, поэтому можно передать туда
def valid_string(s: str) -> bool:
if s[0] == 'c' and s[2].isdigit() ...
это будет даже работать быстрее, поскольку регулярку нужно еще скомпилить