使用Python从字符串中删除数字以外的字符?

发布于 2021-01-29 14:55:41

如何从字符串中删除除数字以外的所有字符?

关注者
0
被浏览
173
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在Python 2. *中,到目前为止最快的方法是.translate

    >>> x='aaa12333bb445bb54b5b52'
    >>> import string
    >>> all=string.maketrans('','')
    >>> nodigs=all.translate(all, string.digits)
    >>> x.translate(all, nodigs)
    '1233344554552'
    >>>
    

    string.maketrans生成一个转换表(长度为256的字符串),在这种情况下,该转换表与''.join(chr(x) for x in range(256))(更快地制作;-)相同。.translate应用转换表(这里无关紧要,因为all本质上是指身份),并删除第二个参数(关键部分)中存在的字符。

    .translate在Unicode字符串(和Python 3中的字符串)上的工作方式大不相同-我 确实
    希望指出问题是关注哪个Python的主要发行版!)-并不是那么简单,不是那么快,尽管仍然非常有用。

    回到2. *,性能差异令人印象深刻……:

    $ python -mtimeit -s'import string; all=string.maketrans("", ""); nodig=all.translate(all, string.digits); x="aaa12333bb445bb54b5b52"' 'x.translate(all, nodig)'
    1000000 loops, best of 3: 1.04 usec per loop
    $ python -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
    100000 loops, best of 3: 7.9 usec per loop
    

    将事情加速7到8倍几乎不是花生,因此该translate方法非常值得了解和使用。另一种流行的非RE方法…:

    $ python -mtimeit -s'x="aaa12333bb445bb54b5b52"' '"".join(i for i in x if i.isdigit())'
    100000 loops, best of 3: 11.5 usec per loop
    

    比RE慢50%,因此该.translate方法将其击败了一个数量级。

    在Python
    3或Unicode中,您需要传递.translate一个映射(以普通字符而不是直接字符作为键),该映射返回None要删除的内容。这是删除“除以下所有内容外的所有字符”的便捷方式:

    import string
    
    class Del:
      def __init__(self, keep=string.digits):
        self.comp = dict((ord(c),c) for c in keep)
      def __getitem__(self, k):
        return self.comp.get(k)
    
    DD = Del()
    
    x='aaa12333bb445bb54b5b52'
    x.translate(DD)
    

    也发出'1233344554552'。但是,将其放入xx.py中,我们可以…:

    $ python3.1 -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
    100000 loops, best of 3: 8.43 usec per loop
    $ python3.1 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)'
    10000 loops, best of 3: 24.3 usec per loop
    

    …表明性能优势对于这种“删除”任务消失了,而变成了性能下降。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看