我有像'12454v','346346z'这样的字符串。我想从字符串中删除所有字母。
重新工作正常:
import re
str='12454v'
re.sub('[^0-9]','', str)
#return '12454'
有没有办法在不使用正则表达式的情况下做到这一点?
我有像'12454v','346346z'这样的字符串。我想从字符串中删除所有字母。
重新工作正常:
import re
str='12454v'
re.sub('[^0-9]','', str)
#return '12454'
有没有办法在不使用正则表达式的情况下做到这一点?
>>> ''.join(filter(str.isdigit, '12454v'))
'12454'
在 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 中使用翻译表比join/filter 方法快得多:
>>> 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
我想你可以试试这个.translate
方法。
>>> import string
>>> str='12454v'
>>> str.translate(None, string.letters)
'12454'
.translate
关于方法here有一个很好的答案。
这比其他的不太优雅,因为它没有使用特定的函数并且有点笨重:
newStr = ''
myStr='12454v'
for char in myStr:
try:
newStr += str(int(char))
except ValueError:
pass
print newStr
同样,这不是最好的方法,但我只是把它扔在那里。我将它转换为int
第一个,以便它可以检查是否是整数。然后,我将其转换为 astr
以便可以将其添加到newStr
.
另一方面,您不应该将str
其用作变量名,因为它会影响内置函数str()
。