2009-05-03 27 views
13

Estoy intentando eliminar todos los dígitos de una cadena. Sin embargo, el siguiente código también borra los dígitos contenidos en cualquier palabra, y obviamente no quiero eso. He estado probando muchas expresiones regulares sin éxito.Eliminar dígitos en Python (Regex)

Gracias!


s = "This must not b3 delet3d, but the number at the end yes 134411" 
s = re.sub("\d+", "", s) 
print s 

Resultado:

Esto no debe b deletd, pero el número al final sí

Respuesta

18

Añadir un espacio antes del \ d +.

>>> s = "This must not b3 delet3d, but the number at the end yes 134411" 
>>> s = re.sub(" \d+", " ", s) 
>>> s 
'This must not b3 delet3d, but the number at the end yes ' 

Editar: Después de mirar los comentarios, decidí formar una respuesta más completa. Creo que esto explica todos los casos.

s = re.sub("^\d+\s|\s\d+\s|\s\d+$", " ", s) 
+0

¡Oh, gracias, funcionó! – Menda

+1

¿Qué pasa con cadenas como "3at"? – marcog

+0

Aquí hay otros 2 casos para las pruebas de su unidad: '123 debe eliminarse'. y 'Usted ha sido 0wn3d' –

2

Si su número siempre se encuentra al final de sus cuerdas Proveedores: re.sub ("\ d + $", "", s)

de lo contrario, se puede tratar re.sub ("(\ s) \ d + (\ s)", "\ 1 \ 2", s)

Puede ajustar las referencias anteriores para mantener solo uno o dos de los espacios (coincide con cualquier separador blanco)

+0

\ W es probablemente mejor que \ s para esto. Además, una mejor variación sería "\ b \ d + \ b", ¡excepto que no funciona para mí! – dwc

12

Prueba esto:

"\b\d+\b" 

Eso coincidirá solo con los dígitos que no forman parte de otra palabra.

+0

Esto no borra el primer o el último número para, s = s = "1234 Esto no debe b3 delet3d, 123 pero el número al final sí 134411" – oneporter

+0

Acabo de probarlo con su cadena y obtuve el resultado esperado. \ b coincide con el principio de la cadena, el final o cualquier cosa que no sea un carácter de palabra ([A-Za-z0-9_]). Sin embargo, lo probé en IronPython, no sé si hay algún problema con el manejo de los límites de palabras de Python. – jrcalzada

+0

No lo he intentado, pero podrías hacer algo como: [^ \ b] \ d + [$ \ b] –

2

Para manejar cadenas de dígitos en el principio de una línea así:

s = re.sub(r"(^|\W)\d+", "", s) 
5

usando \s no es muy bueno, ya que no maneja pestañas, et al. Un primer corte en una mejor solución es:

re.sub(r"\b\d+\b", "", s) 

Tenga en cuenta que el patrón es una cadena de texto en \b porque normalmente es el escape de retroceso para cuerdas, y queremos que el límite de palabra especial de expresiones regulares escapar en su lugar. Una versión ligeramente más elegante es:

re.sub(r"$\d+\W+|\b\d+\b|\W+\d+$", "", s) 

que trata de eliminar los espacios en blanco que conduce/detrás cuando hay dígitos al principio/final de la cadena. Digo "intenta" porque si hay varios números al final, entonces todavía tiene algunos espacios.

1

solución para no regex:

>>> s = "This must not b3 delet3d, but the number at the end yes 134411" 
>>> " ".join([x for x in s.split(" ") if not x.isdigit()]) 
'This must not b3 delet3d, but the number at the end yes' 

Splits por " ", y comprueba si el trozo es un número al hacer str().isdigit(), a continuación, se une a ellos de nuevo juntos.Más informa extensamente (sin utilizar una lista por comprensión):

words = s.split(" ") 
non_digits = [] 
for word in words: 
    if not word.isdigit(): 
     non_digits.append(word) 

" ".join(non_digits) 
1

No sé cuál es su situación real se parece, pero la mayoría de las respuestas parece que no van a manejar números negativos o decimales,

re.sub(r"(\b|\s+\-?|^\-?)(\d+|\d*\.\d+)\b","")

lo anterior también se debe manejar cosas como,

"Esto no debe delet3d b3, pero el número al final sí -134.411"

Pero esto aún está incompleto; probablemente necesite una definición más completa de lo que puede esperar encontrar en los archivos que necesita analizar.

Editar: también vale la pena señalar que '\ b' cambia dependiendo de la configuración regional/juego de caracteres que está utilizando, por lo que debe tener un poco de cuidado con eso.

0
>>>s = "This must not b3 delet3d, but the number at the end yes 134411" 
>>>s = re.sub(r"\d*$", "", s) 
>>>s 

"Este delet3d no debe b3, pero el número al final sí"

Esto eliminará los Numericals al final de la cadena.