从Python中的字符串中删除所有非数字字符("."除外)

ada*_*dam 59 python

我有一个非常好的工作snippit代码,但我想知道是否有人有任何更好的建议如何这样做:

val = ''.join([c for c in val if c in '1234567890.'])
Run Code Online (Sandbox Code Playgroud)

你会怎么做?

Mil*_*les 114

您可以使用正则表达式(使用re模块)来完成同样的事情.下面的示例匹配[^\d.](任何不是十进制数字或句点的字符)的运行,并用空字符串替换它们.请注意,如果使用UNICODE标志编译模式,则生成的字符串仍可包含非ASCII数字.此外,删除"非数字"字符后的结果不一定是有效数字.

>>> import re
>>> non_decimal = re.compile(r'[^\d.]+')
>>> non_decimal.sub('', '12.34fe4e')
'12.344'
Run Code Online (Sandbox Code Playgroud)

  • 包含量词的+1.请注意,在这种情况下您不需要编译模式; Python缓存最近使用的模式.相反,只需使用`re.sub(r'[^\d.] +','','12 .34fe4e') (14认同)
  • Python确实缓存了最近使用的模式(最后100个,如果内存服务),但我喜欢这里的编译,因为你可以通过合理的名称来引用模式,而不是每次读取代码时对正则表达式进行心理解码. (3认同)

max*_*axp 17

另一种'pythonic'方法

filter( lambda x: x in '0123456789.', s )

但正则表达式更快.


Col*_*ett 13

这是一些示例代码:

$ cat a.py
a = '27893jkasnf8u2qrtq2ntkjh8934yt8.298222rwagasjkijw'
for i in xrange(1000000):
    ''.join([c for c in a if c in '1234567890.'])
Run Code Online (Sandbox Code Playgroud)
$ cat b.py
import re

non_decimal = re.compile(r'[^\d.]+')

a = '27893jkasnf8u2qrtq2ntkjh8934yt8.298222rwagasjkijw'
for i in xrange(1000000):
    non_decimal.sub('', a)
Run Code Online (Sandbox Code Playgroud)
$ cat c.py
a = '27893jkasnf8u2qrtq2ntkjh8934yt8.298222rwagasjkijw'
for i in xrange(1000000):
    ''.join([c for c in a if c.isdigit() or c == '.'])
Run Code Online (Sandbox Code Playgroud)
$ cat d.py
a = '27893jkasnf8u2qrtq2ntkjh8934yt8.298222rwagasjkijw'
for i in xrange(1000000):
    b = []
    for c in a:
        if c.isdigit() or c == '.': continue
        b.append(c)

    ''.join(b)
Run Code Online (Sandbox Code Playgroud)

时间结果如下:


$ time python a.py
real    0m24.735s
user    0m21.049s
sys     0m0.456s

$ time python b.py
real    0m10.775s
user    0m9.817s
sys     0m0.236s

$ time python c.py
real    0m38.255s
user    0m32.718s
sys     0m0.724s

$ time python d.py
real    0m46.040s
user    0m41.515s
sys     0m0.832s
Run Code Online (Sandbox Code Playgroud)

到目前为止看起来正则表达式是胜利者.

就个人而言,我发现正则表达式与列表理解一样可读.如果你只做了几次,那么你可能会在编译正则表达式时受到更大的打击.用你的代码和编码风格做点什么.

  • 您可以使用timeit模块更轻松(更准确地)执行这些微基准测试.例如:$ python -m timeit -s"import re; non_decimal = re.compile(r'[^\d.] +'); a ='27893jkasnf8u2qrtq2ntkjh8934yt8.298222rwagasjkijw'""non_decimal.sub('',a) " (2认同)

小智 8

一个简单的解决方案是使用常规的经验

import re 
re.sub("[^0-9^.]", "", data)
Run Code Online (Sandbox Code Playgroud)