¿Cómo eliminamos todos los caracteres no numéricos de una cadena en Python?Eliminando todos los caracteres no numéricos de la cadena en Python
Respuesta
>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'
que podría ser re.sub (r "\ D", "", "sdkjh987978asd098as0980a98sd") – newacct
No estoy seguro si esta es la manera más eficiente, pero:
>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'
La parte ''.join
significa combinar todos los caracteres resultantes juntos sin ningún carácter en el medio. Luego, el resto es una lista de comprensión, donde (como probablemente puedas adivinar) solo tomamos las partes de la cadena que coinciden con la condición isdigit
.
Eso hace lo contrario. Creo que te refieres a "no c.isdigit()" –
Eliminar todo lo no numérico == mantener solo numérico. –
Me gusta que este enfoque no requiera el pull in re, para esta sencilla función. – triunenature
más rápido enfoque, si necesita realizar más de sólo una o dos de estas operaciones de eliminación (o incluso sólo uno, sino en una cadena muy larga! -), es confiar en el método de cadenas translate
, a pesar de que necesita un poco de preparación:
>>> import string
>>> allchars = ''.join(chr(i) for i in xrange(256))
>>> identity = string.maketrans('', '')
>>> nondigits = allchars.translate(identity, string.digits)
>>> s = 'abc123def456'
>>> s.translate(identity, nondigits)
'123456'
El método translate
es diferente, y quizás un poco más sencillo más fácil de usar, en cadenas Unicode de lo que es en cadenas de bytes, por cierto:
>>> unondig = dict.fromkeys(xrange(65536))
>>> for x in string.digits: del unondig[ord(x)]
...
>>> s = u'abc123def456'
>>> s.translate(unondig)
u'123456'
Puede usar una clase de mapeo en lugar de una dicción real, especialmente si su cadena Unicode puede contener caracteres con valores ord muy altos (eso haría que el dic sea excesivamente grande ;-). Por ejemplo:
>>> class keeponly(object):
... def __init__(self, keep):
... self.keep = set(ord(c) for c in keep)
... def __getitem__(self, key):
... if key in self.keep:
... return key
... return None
...
>>> s.translate(keeponly(string.digits))
u'123456'
>>>
(1) No codificar números mágicos; s/65536/sys.maxunicode/(2) El dict es incondicionalmente "excesivamente grande" porque la entrada "potencialmente" puede contener entradas '(sys.maxunicode - number_of_non_numeric_chars)'. (3) considere si string.digits puede no ser suficiente para abrir el módulo unicodedata (4) considere re.sub (r '(? U) \ D +', u '', texto) para simplificar y potencializar velocidad. –
Esto debería funcionar para cuerdas y objetos Unicode:
# python <3.0
def only_numerics(seq):
return filter(type(seq).isdigit, seq)
# python ≥3.0
def only_numerics(seq):
seq_type= type(seq)
return seq_type().join(filter(seq_type.isdigit, seq))
y solo en python 2.x – SilentGhost
Gracias por el recordatorio, SilentGhost. – tzot
Tiene una barra diagonal inversa, pero SO no me deja arreglarlo. –
sólo para añadir otra opción a la mezcla, hay varias constantes útiles dentro del módulo string
. Si bien es más útil en otros casos, se pueden usar aquí.
>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
Hay varias constantes en el módulo, incluyendo:
ascii_letters
(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz)hexdigits
(abcdefABCDEF)
Si está utilizando estas constantes en gran medida, lo que puede Valga la pena encubrirlos a frozenset
. Eso habilita O (1) búsquedas, en lugar de O (n), donde n es la longitud de la constante para las cadenas originales.
>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
'' .join (c para c en "abc123def456" si c.isdigit()) funciona en mi python 3.4 –
user = (input):
print ("hello")
- 1. Eliminando caracteres no numéricos y no alfa de una cadena?
- 2. Elimine todos los caracteres no numéricos de la cadena en JavaScript
- 3. Eliminar todos los caracteres no alfabéticos, no numéricos de una cadena?
- 4. Java eliminar caracteres no numéricos de la cadena excepto x
- 5. Reemplazar caracteres no numéricos
- 6. Eliminando N primeros caracteres de la cadena
- 7. Eliminar todos los caracteres no ASCII de la cadena
- 8. C# expresión regular para eliminar todos los caracteres alfabéticos y numéricos de una cadena?
- 9. Eliminar todos los caracteres no numéricos en el campo de entrada en el evento pegar Javascript
- 10. ¿Cómo reemplazar caracteres no numéricos en MySQL?
- 11. Tira de T-SQL todos los caracteres no alfa y no numéricos
- 12. eliminando los números de la cadena?
- 13. RegEx: toma todos los caracteres numéricos después de un carácter de texto
- 14. Eliminando caracteres de control de una cadena UTF-8
- 15. eliminando @ email.com de la cadena en php
- 16. Coldfusion: ¿elimina todos los valores no numéricos de una lista?
- 17. Eliminar todos los "caracteres de palabra" no de una cadena en Java, dejando caracteres acentuados?
- 18. Regex para eliminar todos los caracteres especiales de la cadena?
- 19. Eliminando TODOS los productos en Magento
- 20. Javascript expresiones regulares - reemplazar los caracteres no numéricos
- 21. Eliminando todos los búferes vacíos en VIM
- 22. Causa inversa de todos los caracteres alfabéticos en C# cadena
- 23. Eliminando espacios de la cadena
- 24. MySQL tira caracteres no numéricos para comparar
- 25. manera rápida para dividir alfa y caracteres numéricos en una cadena de Python
- 26. Eliminar todos los caracteres especiales de una cadena en R?
- 27. reemplazar caracteres no numéricos con javascript?
- 28. Eliminación de todos los caracteres no deseados utilizando el NSCharacterSet
- 29. Eliminando todos los elementos secundarios de la cuadrícula en WPF
- 30. Strip, pero todos los 5 primeros caracteres - Python
duplicado posible: http://stackoverflow.com/questions/947776/strip-all-non-numeric-characters-except-for-from-a-string-in-python – ChristopheD