Если вы ищете эффективность. Использование функции translate - самое быстрое, что вы можете получить.
Может использоваться для быстрой замены символов и / или их удаления.
import string
delete_table = string.maketrans(
string.ascii_lowercase, ' ' * len(string.ascii_lowercase)
)
table = string.maketrans('', '')
"Agh#$%#%2341- -!zdrkfd".translate(table, delete_table)
В python 2.6: вам больше не нужен второй стол
import string
delete_table = string.maketrans(
string.ascii_lowercase, ' ' * len(string.ascii_lowercase)
)
"Agh#$%#%2341- -!zdrkfd".translate(None, delete_table)
Этот метод намного быстрее, чем любой другой. Конечно, вам нужно где-то хранить delete_table и использовать его. Но даже если вы не сохраняете и не создаете его каждый раз, он все равно будет работать быстрее, чем другие предложенные методы.
Чтобы подтвердить мои претензии, вот результаты:
for i in xrange(10000):
''.join(c for c in s if c.islower())
real 0m0.189s
user 0m0.176s
sys 0m0.012s
При запуске решения с регулярными выражениями:
for i in xrange(10000):
re.sub(r'[^a-z]', '', s)
real 0m0.172s
user 0m0.164s
sys 0m0.004s
[По запросу] Если вы предварительно компилируете регулярное выражение:
r = re.compile(r'[^a-z]')
for i in xrange(10000):
r.sub('', s)
real 0m0.166s
user 0m0.144s
sys 0m0.008s
Запуск метода перевода занял столько же раз:
real 0m0.075s
user 0m0.064s
sys 0m0.012s