如何在Python中删除字符串中的所有非数字字符?
当前回答
最快的方法,如果你需要执行不止一个或两个这样的删除操作(甚至只是一个,但对一个非常长的字符串!-),是依赖于字符串的翻译方法,即使它确实需要一些准备:
>>> 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'
>>>
其他回答
有很多正确答案,但如果你想直接用浮点数,而不使用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
@Ned Batchelder和@newacct给出了正确答案,但是…
以防万一,如果你的字符串中有逗号(,)decimal(.):
import re
re.sub("[^\d\.]", "", "$1,999,888.77")
'1999888.77'
为了在这个组合中添加另一个选项,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'
这应该适用于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))
最快的方法,如果你需要执行不止一个或两个这样的删除操作(甚至只是一个,但对一个非常长的字符串!-),是依赖于字符串的翻译方法,即使它确实需要一些准备:
>>> 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'
>>>
推荐文章
- 如何在Flask-SQLAlchemy中按id删除记录
- 在Python中插入列表的第一个位置
- Python Pandas只合并某些列
- 如何在一行中连接两个集而不使用“|”
- 从字符串中移除前缀
- 代码结束时发出警报
- 如何在Python中按字母顺序排序字符串中的字母
- 在matplotlib中将y轴标签添加到次要y轴
- 如何消除数独方块的凹凸缺陷?
- 为什么出现这个UnboundLocalError(闭包)?
- 使用Python请求的异步请求
- 如何检查一个对象是否是python中的生成器对象?
- 如何从Python包内读取(静态)文件?
- 如何计算一个逻辑sigmoid函数在Python?
- python: SyntaxError: EOL扫描字符串文字