@EnotShow

Почему regex работает некорректно?

У меня есть строка:
data = "type=for_all, text=gffdbdfbdfbd, "
Я пытаюсь сделать для этой строки regex:
re.search('type=(.*),', data).group(1)
Ожидаю получить результат "for_all", так как предварительно проверил, что это должно работать на regex101:
62feaee8dfc8b092251895.png
Но получаю:
for_all, text=gffdbdfbdfbd
Что я делаю не так?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Упрощённый пример: что сматчит "\d+" в строке "123456"? Очевидно, всё - потому что умолчанию квантификаторы + и * жадные, т.е. пытаются сматчить как можно больше. У тебя .* - т.е. "матчи всё подряд, сколько получится", а ограничивается только тем, что "дальше должна идти запятая и пробел". Обрати внимание на ещё одну запятую с пробелом в конце твоей строки data.
Что делать?
а) сделать квантификатор не жадным: type=(.*?), Тогда он будет пытаться сматчить как можно меньше.
б) уточнить, какие именно символы могут захватываться группой type=([a-zA-Z0-9_]+),
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@PavelMos
* это жадный квантификатор, он захватывает всегда максимум, то есть будет собирать все (любые, в т.ч. запятые) символы до последней запятой. А на регекс101 при копипасте, возможно, последняя запятая не вставилась, поэтому выражение сработало корректно и остановилось на for_all,
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы