Ответ 1
Ваше регулярное выражение работает в катастрофическом обратном отслеживании, потому что у вас есть вложенные кванторы (([...]+)*
). Поскольку вашему регулярному выражению требуется, чтобы строка заканчивалась на /
(что не удается на вашем примере), механизм regex пытается перестановок строки в тщетной надежде найти соответствующую комбинацию. То, где он застревает.
Чтобы проиллюстрировать, допустим "A*BCD"
как вход в ваше регулярное выражение и посмотреть, что произойдет:
-
(\w+)
соответствуетA
. Хорошо. -
\*
соответствует*
. Yay. -
[\w\s]+
соответствуетBCD
. OK. -
/
не соответствует (никаких символов не осталось). ОК, пусть резервное копирование одного символа. -
/
не соответствуетD
. Hum. Вернемся еще немного. -
[\w\s]+
соответствуетBC
, а повторение[\w\s]+
соответствуетD
. -
/
не соответствует. Резервное копирование. -
/
не соответствуетD
. Создайте резервную копию еще. -
[\w\s]+
соответствуетB
, а повторение[\w\s]+
соответствуетCD
. -
/
не соответствует. Создайте резервную копию снова. -
/
не соответствуетD
. Еще раз создайте резервную копию. - Как насчет
[\w\s]+
соответствуетB
, повторяется[\w\s]+
соответствуетC
, повторяется[\w\s]+
соответствуетD
? Нет? Попробуйте что-то еще. -
[\w\s]+
соответствуетBC
. Позвольте остановиться здесь и посмотреть, что произойдет. - Darn,
/
по-прежнему не соответствуетD
. -
[\w\s]+
соответствуетB
. - По-прежнему не повезло.
/
не соответствуетC
. - Эй, вся группа необязательна
(...)*
. - Нет,
/
по-прежнему не соответствуетB
. - Хорошо, я сдаюсь.
Теперь это была строка из трех букв. У вас было около 30, пытаясь все перестановки, которые заставили бы ваш компьютер заняты до конца дней.
Я предполагаю, что вы пытаетесь получить строки до/после *
, и в этом случае используйте
pattern = r"(\w+)\*([\w\s]+)$"