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í

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top