2010-11-05 14 views
17

Quiero quitar todos los caracteres no alfanuméricos, EXCEPTO el guión de una cadena (python). ¿Cómo puedo cambiar esta expresión regular para que coincida con cualquier carácter no alfanumérico excepto el guión?¿Cómo excluir un personaje de un grupo regex?

re.compile('[\W_]') 

Thanks.

Respuesta

24

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.

+2

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

+0

lo haría más económico. – SilentGhost

+0

Perfecto. ¡Gracias! – ash

4

\w los partidos alfanuméricos, añaden en el guión, y luego negar todo el conjunto: r"[^\w-]"

+0

Supongo que el guión bajo se considera no alfanumérico;) – SilentGhost

+0

Esto no coincidirá/reemplazará el carácter de subrayado, que hace la expresión regular actual del OP. – eldarerathis

Cuestiones relacionadas