我们如何从Python中删除字符串中的所有非数字字符?
答案 0 :(得分:213)
>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'
答案 1 :(得分:75)
不确定这是否是最有效的方式,但是:
>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'
''.join
部分表示将所有结果字符组合在一起,两者之间没有任何字符。然后剩下的就是列表理解,在那里(你可能猜到)我们只取出符合条件isdigit
的字符串部分。
答案 2 :(得分:13)
这适用于字符串和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))
答案 3 :(得分:5)
最快的方法,如果您需要执行的不仅仅是一个或两个这样的删除操作(或者甚至只需要一个,但是在非常长的字符串上! - ),则依赖于translate
字符串方法,即使它确实需要一些准备:
>>> 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'
translate
方法在Unicode字符串上比在字节字符串上使用更简单,可能更简单,btw:
>>> 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'
>>>
答案 4 :(得分:5)
只是为混合添加另一个选项,string
模块中有几个有用的常量。虽然在其他情况下更有用,但可以在这里使用它们。
>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
模块中有几个常量,包括:
ascii_letters
(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)hexdigits
(0123456789abcdefABCDEF)如果你大量使用这些常量,那么将它们转换为frozenset
是值得的。这样就可以进行O(1)查找,而不是O(n),其中n是原始字符串常量的长度。
>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
答案 5 :(得分:2)
很多正确的答案,但是如果您希望直接使用浮点数,而无需使用正则表达式:
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
答案 6 :(得分:1)
@Ned Batchelder和@newacct提供了正确的答案,但是...
以防万一,如果字符串中有逗号(,)小数点(。):
VALUES