如何在Python中删除字符串中的所有非数字字符?


当前回答

有很多正确答案,但如果你想直接用浮点数,而不使用regex:

x= '$123.45M'

float(''.join(c for c in x if (c.isdigit() or c =='.'))

123.45

您可以根据需要将这个点改为逗号。

如果您知道您的数字是整数,则更改此值

x='$1123'    
int(''.join(c for c in x if c.isdigit())

1123

其他回答

不确定这是否是最有效的方法,但是:

>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'

”。连接部分是指将所有产生的字符组合在一起,中间没有任何字符。然后它的其余部分是一个生成器表达式,其中(正如您可能猜到的那样)我们只取字符串中与条件isdigit匹配的部分。

这应该适用于Python2中的字符串和unicode对象,以及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))

@Ned Batchelder和@newacct给出了正确答案,但是…

以防万一,如果你的字符串中有逗号(,)decimal(.):

import re
re.sub("[^\d\.]", "", "$1,999,888.77")
'1999888.77'

有很多正确答案,但如果你想直接用浮点数,而不使用regex:

x= '$123.45M'

float(''.join(c for c in x if (c.isdigit() or c =='.'))

123.45

您可以根据需要将这个点改为逗号。

如果您知道您的数字是整数,则更改此值

x='$1123'    
int(''.join(c for c in x if c.isdigit())

1123

最快的方法,如果你需要执行不止一个或两个这样的删除操作(甚至只是一个,但对一个非常长的字符串!-),是依赖于字符串的翻译方法,即使它确实需要一些准备:

>>> 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'

翻译方法是不同的,可能更简单一点,在Unicode字符串上比在字节字符串上更容易使用,顺便说一下:

>>> unondig = dict.fromkeys(xrange(65536))
>>> for x in string.digits: del unondig[ord(x)]
... 
>>> s = u'abc123def456'
>>> s.translate(unondig)
u'123456'

您可能希望使用映射类而不是实际的dict,特别是如果您的Unicode字符串可能包含非常高的ord值的字符(这会使dict过大;-)。例如:

>>> 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'
>>>