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


当前回答

为了在这个组合中添加另一个选项,string模块中有几个有用的常量。虽然在其他情况下更有用,但在这里可以使用它们。

>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'

模块中有几个常量,包括:

ascii_letters (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ) 十六进制数字 (0123456789abcdefABCDEF)

如果你大量使用这些常量,将它们转换成一个冻结集是值得的。这样可以进行O(1)次查找,而不是O(n)次查找,其中n是原始字符串常量的长度。

>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'

其他回答

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

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

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

一个简单的方法:

str.isdigit()如果str只包含数字字符则返回True。调用filter(predicate, iterable),将str.isdigit作为谓词,将字符串作为迭代对象,返回一个只包含字符串的数字字符的迭代对象。调用str.join(iterable),将空字符串作为str,将filter()的结果作为iterable,将每个数字字符连接到一个字符串中。

例如:

a_string = "!1a2;b3c?"
numeric_filter = filter(str.isdigit, a_string)
numeric_string = "".join(numeric_filter)
print(numeric_string)

输出为:

123

这应该适用于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))

有很多正确答案,但如果你想直接用浮点数,而不使用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 re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'