替换非数字字符

时间:2010-09-04 16:20:48

标签: python regex string

我需要从字符串中替换非数字字符。

例如,“8-4545-225-144”需要为“84545225144”; “$ 334fdf890 == - ”必须是“334890”。

我该怎么做?

6 个答案:

答案 0 :(得分:18)

''.join(c for c in S if c.isdigit())

答案 1 :(得分:17)

可以使用正则表达式。

import re

...

return re.sub(r'\D', '', theString)

答案 2 :(得分:3)

filter(str.isdigit, s)比此处列出的任何其他内容更快,IMO更清晰。

如果s是unicode类型,它也会抛出TypeError。根据你想要的“数字”的定义,这可能比替代filter(type(s).isdigit, s)更有用或更少,比我的re和理解版本稍慢但速度更快。

编辑:虽然如果你是一个坚持使用Python 3的糟糕傻瓜,你需要使用"".join(filter(str.isdigit, s)),这会让你坚定地处于等效性能不佳的领域。这样的进步。

答案 3 :(得分:1)

让我们来计算joinre版本:

In [3]: import re

In [4]: def withRe(theString): return re.sub('\D', '', theString)
   ...:

In [5]:

In [6]: def withJoin(S): return ''.join(c for c in S if c.isdigit())
   ...:


In [11]: s = "8-4545-225-144"

In [12]: %timeit withJoin(s)
100000 loops, best of 3: 6.89 us per loop

In [13]: %timeit withRe(s)
100000 loops, best of 3: 4.77 us per loop

join相比,re版本要好得多,但不幸的是慢了50%。因此,如果性能是一个问题,可能需要牺牲优雅。

修改

In [16]: def withFilter(s): return filter(str.isdigit, s)
   ....:
In [19]: %timeit withFilter(s)
100000 loops, best of 3: 2.75 us per loop

看起来filter是性能和可读性的赢家

答案 4 :(得分:0)

虽然设置稍微复杂一些,但使用translate()字符串方法删除如下所示的字符可以比使用join()re.sub()快4-6倍根据我执行的时间测试 - 所以如果它是多次完成的事情,你可能想要考虑使用它。

nonnumerics = ''.join(c for c in ''.join(chr(i) for i in range(256)) if not c.isdigit())

astring = '123-$ab #6789'
print astring.translate(None, nonnumerics)
# 1236789

答案 5 :(得分:0)

我更喜欢正则表达式,所以如果您愿意,可以使用

import re
myStr = '$334fdf890==-'
digts = re.sub('[^0-9]','',myStr) 

这应该用''替换所有非数字的出现,即没有任何东西。所以digts变量应该是'334890'