2013-02-07 149 views
7

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

重新正常工作:

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

#return '12454' 

有没有办法做到这一点,而无需使用正则表达式?

+0

@kojiro我纠正了。 –

回答

8
>>> ''.join(filter(str.isdigit, '12454v')) 
'12454' 
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

我认为你可以.translate方法试试这个。

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

有大约.translate方法here一个很好的答案。

1

这是一个比别人几分优雅较少,因为它不使用特定的功能,是较为笨拙:

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

再次,这是不是最好的方式,但我只是把它扔了那里。 我首先将它转换为int,以便它可以检查是否为整数。然后,我将它转换为str,以便它可以添加到newStr

另一方面,您不应该使用str作为变量名称,因为它会隐藏内置函数str()