Respuestas:
>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'
No estoy seguro si esta es la forma más eficiente, pero:
>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'
La ''.join
parte significa combinar todos los caracteres resultantes juntos sin ningún carácter intermedio. Luego, el resto es una comprensión de la lista, donde (como probablemente puedas adivinar) solo tomamos las partes de la cadena que coinciden con la condición isdigit
.
Esto debería funcionar para cadenas y objetos unicode en Python2, y tanto cadenas como bytes en Python3:
# 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))
Solo para agregar otra opción a la mezcla, hay varias constantes útiles dentro del string
módulo. Si bien son más útiles 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, que incluyen:
ascii_letters
(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)hexdigits
(0123456789abcdefABCDEF)Si está utilizando estas constantes en gran medida, puede valer la pena convertirlas en a frozenset
. Eso permite búsquedas O (1), 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'
El enfoque más rápido, si necesita realizar más de una o dos de estas operaciones de eliminación (¡o incluso solo una, pero en una cadena muy larga! -), es confiar en el translate
método de cadenas, a pesar de que necesita alguna 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 translate
método es diferente, y tal vez un poco más simple de usar, en cadenas Unicode que 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'
Es posible que desee utilizar una clase de mapeo en lugar de un dict real, especialmente si su cadena Unicode puede contener caracteres con valores ord muy altos (eso haría que el dict 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'
>>>
(sys.maxunicode - number_of_non_numeric_chars)
entradas. (3) considere si string.digits puede no ser suficiente, lo que lleva a la necesidad de abrir el módulo unicodedata (4) considere re.sub (r '(? U) \ D +', u '', texto) por simplicidad y potencial velocidad.
Muchas respuestas correctas, pero en caso de que lo desee en un flotador, directamente, sin usar expresiones regulares:
x= '$123.45M'
float(''.join(c for c in x if (c.isdigit() or c =='.'))
123,45
Puede cambiar el punto de una coma según sus necesidades.
cambie esto si sabe que su número es un entero
x='$1123'
int(''.join(c for c in x if c.isdigit())
1123