【问题标题】:Removing all digits from a string on python从python上的字符串中删除所有数字
【发布时间】:2013-12-02 18:53:35
【问题描述】:

所以我需要一些帮助来删除这个字符串中的数字

import re

g="C0N4rtist"

re.sub(r'\W','',g)'

print(re.sub(r'\W','',g))

它应该看起来像

CNrtist

但它给了我 04

我通过在线研究制作了此代码,并使用此网站http://docs.python.org/2/library/re.html 寻求帮助。在我看来,代码应该可以工作,而且我不知道哪里出了问题,所以让我知道哪里出了问题会非常有帮助,因为我已经在网上和 stackoverflow 中进行了研究。

【问题讨论】:

  • 或者只使用生成器表达式而不是reprint(''.join(x for x in g if not x in "0123456789"))

标签: python regex


【解决方案1】:

使用\d 表示数字:

>>> import re
>>> g = "C0N4rtist"
>>> re.sub(r'\d+', '', g)
'CNrtist'

请注意,您不需要正则表达式,str.translate 与正则表达式版本相比非常快

>>> from string import digits
>>> g.translate(None, digits)
'CNrtist'

时间安排:

>>> g = "C0N4rtist"*100
>>> %timeit g.translate(None, digits)      #winner
100000 loops, best of 3: 9.98 us per loop
>>> %timeit ''.join(i for i in g if not i.isdigit())
1000 loops, best of 3: 507 us per loop
>>> %timeit re.sub(r'\d+', '', g)
1000 loops, best of 3: 253 us per loop
>>> %timeit ''.join([i for i in g if not i.isdigit()])
1000 loops, best of 3: 352 us per loop
>>> %timeit ''.join([i for i in g if i not in digits])
1000 loops, best of 3: 277 us per loop

【讨论】:

  • 不过,对于 Python 3.x,翻译的形式略有不同:g.translate(dict.fromkeys(map(ord, '0123456789')))(您可能还想尝试 \d 用于正则表达式版本,因为正则表达式引擎不需要担心运行长度或其他任何事情,因此可能会引入一些不必要的开销)
  • +1 表示translate,但 IMO 只应在性能关键的情况下使用它,因为我认为生成器表达式更具可读性。
  • 嗯,这不是一个完全公平的时机,因为生成器表达式显然可以使用in 和一组数字进行优化,但我认为翻译仍然会比这更快:)
  • @l4mpi 事实上,str.join 的生成器表达式总是比较慢,因为它需要两次迭代。
  • @l4mpi 实际上str.joinspecial case
【解决方案2】:

没有必要为此使用正则表达式。你可以使用 isdigit() 函数

   def removeDigitsFromStr(_str):
        result = ''.join(i for i in _str if not i.isdigit())
        return result

【讨论】:

  • 在这种情况下我更喜欢使用in,如... if not i in digits,其中digits"0123456789"set("0123456789") - 但在这种情况下,这主要是个人偏好,并不除非代码对性能至关重要。
  • 我同意。感谢您提出这个问题
猜你喜欢
  • 2010-11-17
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2011-10-19
  • 2021-06-16
  • 1970-01-01
相关资源
最近更新 更多