从字符串中删除字母

时间:2013-02-07 12:03:46

标签: python

我有像'12454v','346346z'这样的字符串。我想删除字符串中的所有字母。

重新正常工作:

import re
str='12454v'
re.sub('[^0-9]','', str)

#return '12454'

有没有办法在不使用正则表达式的情况下执行此操作?

4 个答案:

答案 0 :(得分:9)

>>> ''.join(filter(str.isdigit, '12454v'))
'12454'

答案 1 :(得分:4)

在python 2中,translate方法的第二个参数允许您指定要删除的字符

http://docs.python.org/2/library/stdtypes.html#str.translate

给出的示例显示您可以使用None作为转换表,删除字符:

>>> 'read this short text'.translate(None, 'aeiou')
'rd ths shrt txt'

(您可以将字符串模块中的所有ASCII字母列表string.letters。)

更新:Python 3也有translate方法,但需要略有不同的设置:

from string import ascii_letters
tr_table = str.maketrans({c:None for c in ascii_letters})
'12345v'.transate(tr_table)

对于记录,使用Python 2中的转换表比加入/过滤方法更快:

>>> timeit("''.join(filter(lambda c:not c.isalpha(), '12454v'))")
2.698641061782837
>>> timeit("''.join(filter(str.isdigit, '12454v'))") 
1.9351119995117188
>>> timeit("'12454v'.translate(None, string.letters)", "import string")
0.38182711601257324

同样在Python 3中:

>>> timeit("'12454v'.translate(tr_table)", "import string; tr_table=str.maketrans({c:None for c in string.ascii_letters})")
0.6507143080000333
>>> timeit("''.join(filter(lambda c:not c.isalpha(), '12454v'))")
2.436105844999929

答案 2 :(得分:2)

我认为您可以使用.translate方法尝试此操作。

>>> import string
>>> str='12454v'
>>> str.translate(None, string.letters)
'12454'

.translate方法here有一个非常好的答案。

答案 3 :(得分:1)

这有点不如其他人优雅,因为它没有使用特定的功能,而且更笨重:

newStr = ''
myStr='12454v'
for char in myStr:
    try:
        newStr += str(int(char))
    except ValueError:
        pass
print newStr

同样,这不是最好的方式,但我只是把它扔出去。 我首先将它转换为int,以便它可以检查是否是整数。然后,我将其转换为str,以便将其添加到newStr

另一方面,您不应将str用作变量名称,因为它会影响内置函数str()