Eliminar dígitos en Python (Regex)
Pregunta
Estoy intentando eliminar todos los dígitos de una cadena. Sin embargo, el siguiente código elimina también los dígitos contenidos en cualquier palabra, y obviamente no quiero eso. He intentado muchas expresiones regulares sin éxito.
¡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 se debe borrar, pero el número al final sí
Solución
Agregue un espacio antes de \ 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 ver los comentarios, decidí dar una respuesta más completa. Creo que esto explica todos los casos.
s = re.sub("^\d+\s|\s\d+\s|\s\d+<*>quot;, " ", s)
Otros consejos
Prueba esto:
"\b\d+\b"
Eso solo coincidirá con los dígitos que no forman parte de otra palabra.
Usar \ 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 sin formato porque \ b
es normalmente el escape de retroceso para las cadenas, y en su lugar queremos el escape de la expresión regular del límite de la palabra. Una versión ligeramente más sofisticada es:
re.sub(r"$\d+\W+|\b\d+\b|\W+\d+<*>quot;, "", s)
Eso intenta eliminar los espacios en blanco iniciales / finales cuando hay dígitos al principio / al final de la cadena. Yo digo " intentos " porque si hay varios números al final, todavía tienes algunos espacios.
Para manejar cadenas de dígitos al principio de una línea también:
s = re.sub(r"(^|\W)\d+", "", s)
Si su número está siempre al final de sus cadenas, intente: re.sub (" \ d + $ " ;, " " ;, s)
de lo contrario, puede intentar re.sub (" (\ s) \ d + (\ s) " ;, " \ 1 \ 2 " ;, s)
Puede ajustar las referencias posteriores para mantener solo uno o dos de los espacios (\ s coinciden con cualquier separador blanco)
Solución 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'
Se divide por " "
, y comprueba si el fragmento es un número haciendo < código> str (). isdigit () , luego se une de nuevo. Más verbalmente (sin utilizar una lista de comprensión):
words = s.split(" ")
non_digits = []
for word in words:
if not word.isdigit():
non_digits.append(word)
" ".join(non_digits)
No sé cuál es tu situación real, pero la mayoría de las respuestas parecen no manejar números negativos o decimales,
re.sub (r " (\ b | \ s + \ -? | ^ \ -?) (\ d + | \ d * \. \ d +) \ b ", " ")
Lo anterior también debería manejar cosas como,
" Esto no debe b3 delet3d, 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 según la configuración regional / el conjunto de caracteres que estés usando, por lo que debes tener un poco de cuidado con eso.
Podrías probar esto
s = "This must not b3 delet3d, but the number at the end yes 134411"
re.sub("(\s\d+)","",s)
resultado:
'This must not b3 delet3d, but the number at the end yes'
la misma regla también se aplica a
s = "This must not b3 delet3d, 4566 but the number at the end yes 134411"
re.sub("(\s\d+)","",s)
resultado:
<*>>>>s = "This must not b3 delet3d, but the number at the end yes 134411"
>>>s = re.sub(r"\d*<*>quot;, "", s)
>>>s
" Esto no debe b3 delet3d, pero el número al final sí "
Esto eliminará los números al final de la cadena.