効率を求めるなら。翻訳機能を使用するのが最速です。
文字をすばやく置き換えたり、削除したりするために使用できます。
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 では、2 番目のテーブルはもう必要ありません。
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
translate メソッドを同じ回数実行すると、次のようになります。
real 0m0.075s
user 0m0.064s
sys 0m0.012s