从字符串中删除数字

189

如何从字符串中删除数字?


46
使用 re 模块进行字符串操作:result = re.sub(r'[0-9]+', '', s),意为将字符串中的所有数字替换为空字符串。 - Wiktor Stribiżew
使用正则表达式时,你需要添加 . ,因为它可以是小数。例如:result = re.sub(r'[0-9.]+', '', s)。 - GurhanCagin
8
在正则表达式中,"\d" 和 "[0-9]" 是一样的,因此你可以使用 result = re.sub(r"\d+", "", s)。速度可能取决于所使用的具体字符串,但对我而言,re.sub 的速度大约是 str.translate 的两倍(如果不使用预编译的模式,则略微慢一些)。 - Nathan
2
@LakshmiYadav re.sub(r'[0-9]+', '', s) 删除 找到的匹配项(请注意第二个参数是一个空字符串),它不能添加任何内容。请检查您的代码。 - Wiktor Stribiżew
@LakshmiYadav 这与我的正则表达式无关。请检查您的“print”。 - Wiktor Stribiżew
显示剩余3条评论
8个回答

276

这对你的情况有作用吗?

>>> s = '12abcd405'
>>> result = ''.join([i for i in s if not i.isdigit()])
>>> result
'abcd'
这里使用了列表推导式,这里发生的情况与以下结构类似:
no_digits = []
# Iterate through the string, adding non-numbers to the no_digits list
for i in s:
    if not i.isdigit():
        no_digits.append(i)

# Now join all elements of the list with '', 
# which puts all of the characters together.
result = ''.join(no_digits)

正如 @AshwiniChaudhary 和 @KirkStrauser 所指出的那样,您实际上不需要在一行代码中使用方括号,可以将括号内的部分变为生成器表达式(比列表推导式更高效)。 即使这不符合您任务的要求,也应该 eventually 了解一下 :):

>>> s = '12abcd405'
>>> result = ''.join(i for i in s if not i.isdigit())
>>> result
'abcd'

@SeanJohnson 太棒了!我肯定是从这个网站上的其他人那里学到的,所以循环已经完成 :) - RocketDonkey
1
@RocketDonkey 不需要使用[] - Ashwini Chaudhary
4
在Python 2.7及以上版本中,你不需要在列表推导式周围加上括号。你可以省略它们,这时它就变成了一个生成器表达式。 - Kirk Strauser
@RocketDonkey 加上一些解释吧,我想光看代码对 OP 没有帮助。 - Ashwini Chaudhary
@AshwiniChaudhary 很好的观点 - 已添加(将列表推导式版本放在前面,以使for循环比较更容易理解)。 - RocketDonkey
Jon Clements 的答案中使用的 s.translate 比列表推导式快约 10 倍(在 Python 2.7 中测试)。提醒一下后来阅读此内容的人。 - Patrick

125

还有一个常被忽略的选项是str.translate,它比循环/正则表达式的方法更快:

对于 Python 2:

from string import digits

s = 'abc123def456ghi789zero0'
res = s.translate(None, digits)
# 'abcdefghizero'

对于 Python 3:

from string import digits

s = 'abc123def456ghi789zero0'
remove_digits = str.maketrans('', '', digits)
res = s.translate(remove_digits)
# 'abcdefghizero'

24
这种方法在Python3中行不通。请改用以下方法:'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})(该方法可以从字符串中删除数字) - valignatev
4
Python2的最佳解决方案。 - Harsh Wardhan
不支持Unicode字符串。 - Harry M

24

不确定您的老师是否允许您使用过滤器,但是...

"".join(filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h"))

返回-

'aaasdffgh'

比循环更高效...

例子:

for i in range(10):
  a.replace(str(i),'')

11
它返回了这个内容:<filter object at 0x03475FD0>。 - greendino
你可以使用"".join(filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h"))来获得一个字符串。这里的初始字符串是空字符串。 - rodrigolece
Or better: "".join(filter(lambda ch: not ch.isdigit(), "a1a2a3s3d4f5fg6h")) --- 所以not isdigit更适合这个问题。(我无法编辑答案 :-( 在过去的半年里有太多“正在等待批准”的编辑消息。) - Arpad Horvath -- Слава Україні

7

仅列出几个(其他人已经提出了一些)

方法1:

''.join(i for i in myStr if not i.isdigit())

方法二:

def removeDigits(s):
    answer = []
    for char in s:
        if not char.isdigit():
            answer.append(char)
    return ''.join(answer)

方法三:
''.join(filter(lambda x: not x.isdigit(), mystr))

方法四:

nums = set(map(int, range(10)))
''.join(i for i in mystr if i not in nums)

方法五:

''.join(i for i in mystr if ord(i) not in range(48, 58))

4
展示这些的效率比较是值得的。 - nu everest
1
在第二个方法中,应该是''.join(answer)而不是''.join(char) - Sreram
@Sreram:你说得完全正确!感谢你的错误报告。 - inspectorG4dget

6
这个怎么样:
out_string = filter(lambda c: not c.isdigit(), in_string)

8
输出是 <filter object at 0x7f749e1745c0>。 Python3.6。 - TitanFighter
1
@TitanFighter 你可以通过将从filter返回的对象包装到list(filter(...))中来将生成器强制转换为列表对象。 - ahlusar1989

4

假设st是您未格式化的字符串,则运行

st_nodigits=''.join(i for i in st if i.isalpha())

如上所述。但我猜你需要的是非常简单的东西,所以假设 s 是您的字符串, st_res 是一个没有数字的字符串,那么这就是您的代码
l = ['0','1','2','3','4','5','6','7','8','9']
st_res=""
for ch in s:
 if ch not in l:
  st_res+=ch

2

我希望使用正则表达式来完成这个任务,但由于只能使用列表、循环、函数等方法...

以下是我想到的方法:

stringWithNumbers="I have 10 bananas for my 5 monkeys!"
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!

1
如果我理解你的问题正确,一种方法是将字符串分解为字符,然后使用循环检查该字符串中的每个字符,无论它是字符串还是数字,如果是字符串,则将其保存到变量中,然后一旦循环完成,向用户显示结果。

一个for循环可以自动迭代字符串中的每个字符,因此不需要将字符串分解为字符。 - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接