У вас есть квадратная скобка, где вы должны иметь круглые скобки:
url=re.findall("[\"external_url\":]['https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+']",soup)
url=re.findall("[\"external_url\":]('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+']",soup)
^--- change [ to (
Подсказка была в сообщении об ошибке bad character range [-\w
, что означало, что класс символов был запущен раньше, чем это выражение. Глядя ранее, мы находим ['https?:...
, что тоже не имеет смысла, и это
где проблема была.
Я не знаю, действительно ли работает ваше регулярное выражение - это слишком сложно проверить, особенно когда есть более простой способ сделать это.
Используйте это регулярное выражение
(?<="external_url":")[^"]+
И весь матч будет вашим целевым URL.
См. демо live regex .