【问题标题】:Best way to strip everything except numbers and decimal points from a string in Python从 Python 中的字符串中去除除数字和小数点之外的所有内容的最佳方法
【发布时间】:2015-09-10 22:50:25
【问题描述】:

我正在使用 Python 2.7 读取一个 ASCII 数据流,其中包括带小数位的非负数以及包含不可打印字符、字母和标点符号的“垃圾字符”。我可以通过这种方式去除不可打印的内容:

rawdata2 = filter(lambda x: x in string.printable, rawdata)

但是会留下这样的字符串:

Ri-G2015,2,20.23,9.13,273.1- ZW;w;K-;-A;B`R

什么是去除除数字和小数点 (.) 之外的所有内容的好方法,所以我只剩下这个了:

2015,2,20.23,9.13,273.1

【问题讨论】:

  • 要保留逗号吗?
  • 是的,你是对的 - 我确实需要保留逗号。

标签: python filter


【解决方案1】:

string.printable 只是一个字符串。您可以使用自己的字符串代替它,例如:

rawdata2 = filter(lambda x: x in ',.0123456789', rawdata)

请注意,我包含了一个逗号,因为您的预期输出也包含逗号。

【讨论】:

    【解决方案2】:

    更快的方法是使用正则表达式:

    import re
    
    rawdata2 = re.sub('[^0-9,.]', '', rawdata)
    

    这只是删除不在集合0-9 , . 中的任何字符(通过将它们替换为空字符串)。这比对输入字符串重复 100 次的过滤方法快两倍多,而且更简洁。


    最快的方法(如果您要处理大量文本)是使用string.translate

    deltable = "".join(chr(c) for c in xrange(256) if chr(c) not in "0123456789,.")
    
    rawdata2 = string.translate(rawdata, None, deltable)
    

    这比原来的过滤方法快 100 倍以上。

    【讨论】:

    • 比什么更快?使用in?为什么不在提出这种要求之前先尝试一下。
    • @nanny:添加分析信息,最快的方法string.translate
    • 我刚刚分析了您的 re 版本与我的 filter 答案,我的速度快了 20 倍以上(1000 次重复,python 3.4.3)。我不知道你是怎么得到“这比过滤方法快两倍多”
    • @nanny:在 Python 3.4 上,filter 是惰性的,并且只返回一个迭代器。试试''.join(filter(...))
    【解决方案3】:
    keepchars = string.digits + ",." #the characters you want to keep
    rawdata2 = filter(lambda x: x in keepchars, rawdata)
    

    我会这样做,因为您似乎想将字符列入白名单。相反,如果您决定要将字符列入黑名单,string.translate() 可能是个不错的选择。

    【讨论】:

      【解决方案4】:

      我喜欢正则表达式。很优雅,因为我不知道...

      In [45]: "".join([i for i in mystring if i=="." or i.isdigit() or i==','])
      Out[45]: '2015,2,20.23,9.13,273.1'
      

      【讨论】:

      • 但是...你没有使用正则表达式。
      【解决方案5】:

      谢谢大家。我的程序不需要很快,因为它每隔几分钟只处理一行,但我很欣赏了解不同方法的效率。我最终使用了以下两行:

      include = set('0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '.' ',')
      

      然后

      cleandata1 = ''.join(ch for ch in rawdata if ch in include)
      

      后来我插入了第三行来保存垃圾字符以供检查:

      garbage = ''.join(ch for ch in rawdata if ch not in include) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 2010-10-24
        • 2014-03-21
        • 2010-09-20
        • 2011-11-08
        • 2013-08-08
        相关资源
        最近更新 更多