Самый быстрый подход, если вам нужно выполнить более одной или двух таких операций удаления (или даже только одну, но с очень длинной строкой! -), это полагаться на метод translate
строк, даже если для этого нужно подготовиться:
>>> import string
>>> allchars = ''.join(chr(i) for i in xrange(256))
>>> identity = string.maketrans('', '')
>>> nondigits = allchars.translate(identity, string.digits)
>>> s = 'abc123def456'
>>> s.translate(identity, nondigits)
'123456'
Метод translate
отличается и, возможно, немного проще в использовании для строк Unicode, чем для байтовых строк, кстати:
>>> unondig = dict.fromkeys(xrange(65536))
>>> for x in string.digits: del unondig[ord(x)]
...
>>> s = u'abc123def456'
>>> s.translate(unondig)
u'123456'
Возможно, вы захотите использовать класс сопоставления, а не фактический dict, особенно если ваша строка Unicode может потенциально содержать символы с очень высокими значениями ord (что может привести к чрезмерно большому dict ;-). Например:
>>> class keeponly(object):
... def __init__(self, keep):
... self.keep = set(ord(c) for c in keep)
... def __getitem__(self, key):
... if key in self.keep:
... return key
... return None
...
>>> s.translate(keeponly(string.digits))
u'123456'
>>>