Искал в интернете, но нашёл только однотипные ответы «ты не понимаешь, что такое нежадные регулятные выражения» без дополнительных пояснений.
Поэтому вопрос: чем они отличаются от жадных, и почему не работает re.DOTALL?
Собственно задача. Есть много однотипных файлов, скачанных с перегруженного скриптами сайта (webnovel.com, если интересно). Требуется удалить все теги <script ... </script>
. Однострочник ''.join(re.split('<script.*?</script>', filestring))
удаляет однострочные скрипты, но не удаляет многострочные. ''.join(re.split('<script.*?</script>', filestring, re.DOTALL))
вдобавок не удаляет половину однострочных. Если предварительно прогнать filestring = filestring.replace('\n', '<abzats>')
, удалить скрипты и вернуть filestring = filestring.replace('<abzats>', '\n')
, получается желаемый результат. Почему не работает с DOTALL?
Ответ: Следует вызывать эту функцию как re.split('<script.*?</script>', filestring, flags=re.DOTALL)
без flags re.DOTALL воспринимается как параметр для maxsplit, поэтому часть найденных результатов игнорируется. Так как у меня было 32 результата, игнорировалась ровно половина.
То же относится к re.sub и многим другим.
Если охота побухтеть «HTML невозможно парсить регекспами, существуют специализированные библиотеки», назовите специализированную питоновскую библиотеку для совершения этой операции в 1 строку.