我需要从字符串中替换非数字字符。
例如,“8-4545-225-144”需要为“84545225144”; “$ 334fdf890 == - ”必须是“334890”。
我该怎么做?
答案 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)
让我们来计算join
和re
版本:
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'