Respostas:
>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'
Não tenho certeza se essa é a maneira mais eficiente, mas:
>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'
A ''.join
parte significa combinar todos os caracteres resultantes sem nenhum caractere intermediário. Em seguida, o restante é uma lista de compreensão, onde (como você provavelmente pode imaginar) só pegamos as partes da string que correspondem à condição isdigit
.
Isso deve funcionar para as seqüências de caracteres e os objetos unicode no Python2, e as seqüências de caracteres e bytes no 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))
Apenas para adicionar outra opção à mistura, existem várias constantes úteis dentro do string
módulo. Embora mais úteis em outros casos, eles podem ser usados aqui.
>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
Existem várias constantes no módulo, incluindo:
ascii_letters
(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)hexdigits
(0123456789abcdefABCDEF)Se você estiver usando essas constantes intensamente, pode valer a pena cobri-las para a frozenset
. Isso permite pesquisas O (1), em vez de O (n), onde n é o comprimento da constante para as seqüências originais.
>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
A abordagem mais rápida, se você precisar executar mais do que apenas uma ou duas dessas operações de remoção (ou mesmo apenas uma, mas em uma sequência muito longa! -), é contar com o translate
método de sequências de caracteres, mesmo que precise de alguma preparação:
>>> 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'
O translate
método é diferente, e talvez um pouco mais simples, mais simples de usar, nas cadeias Unicode do que nas cadeias de bytes, btw:
>>> unondig = dict.fromkeys(xrange(65536))
>>> for x in string.digits: del unondig[ord(x)]
...
>>> s = u'abc123def456'
>>> s.translate(unondig)
u'123456'
Você pode querer usar uma classe de mapeamento em vez de um ditado real, especialmente se a sequência Unicode puder conter caracteres com valores ord muito altos (isso tornaria o ditado excessivamente grande ;-). Por exemplo:
>>> 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 se string.digits pode não ser suficiente, levando à necessidade de abrir o módulo unicodedata (4) considere re.sub (r '(? U) \ D +', u '', texto) por simplicidade e potencial Rapidez.
Muitas respostas certas, mas no caso de você querer isso diretamente, sem usar regex:
x= '$123.45M'
float(''.join(c for c in x if (c.isdigit() or c =='.'))
123,45
Você pode alterar o ponto da vírgula, dependendo de suas necessidades.
mude para isso se você souber que seu número é um número inteiro
x='$1123'
int(''.join(c for c in x if c.isdigit())
1123