Ответ 1
Вместо этого вы можете использовать отрицательный класс символов:
re.compile(r"[^a-zA-Z0-9-]")
Это будет соответствовать всем, что не соответствует буквенно-цифровым диапазонам или дефису. Он также соответствует подчеркиванию в соответствии с вашим текущим регулярным выражением.
>>> r = re.compile(r"[^a-zA-Z0-9-]")
>>> s = "some#%te_xt&with--##%--5 hy-phens *#"
>>> r.sub("",s)
'sometextwith----5hy-phens'
Обратите внимание, что это также заменяет пробелы (что, безусловно, может быть тем, что вы хотите).
Изменить: SilentGhost предположил, что, возможно, для процессора будет более выгодно обрабатывать квантификатор, и в этом случае вы можете просто использовать:
re.compile(r"[^a-zA-Z0-9-]+")
+
будет просто приводить к тому, что все последовательности последовательно совпадающих символов будут совпадать (и будут заменены) одновременно.