Se podía utilizar una clase de caracteres negada en su lugar:
re.compile(r"[^a-zA-Z0-9-]")
Esto coincidirá con cualquier cosa que no está en los rangos alfanuméricos o guión. También coincide con el guión bajo, según tu expresión regular actual.
>>> r = re.compile(r"[^a-zA-Z0-9-]")
>>> s = "some#%te_xt&with--##%--5 hy-phens *#"
>>> r.sub("",s)
'sometextwith----5hy-phens'
Tenga en cuenta que esto también reemplaza los espacios (que sin duda puede ser lo que desea).
Editar: SilentGhost ha sugerido que probablemente puede ser más barato que el motor se procesa con un cuantificador, en cuyo caso puede simplemente usar:
re.compile(r"[^a-zA-Z0-9-]+")
El +
simplemente hará que cualquier corrida de los caracteres consecutivamente coincidentes para todos los partidos (y ser reemplazado) al mismo tiempo.
1 tiene usted razón, eliminado mi respuesta como la suya cubre Creo que lo que quiere ... para que coincida con cualquier carácter no un número , letra, o guion El cuantificador – birryree
lo haría más económico. – SilentGhost
Perfecto. ¡Gracias! – ash