#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'
文字列からすべての UPPER を抽出するにはどうすればよいでしょうか?
#output
my_upper = 'ABCDEFGHIJKLMNOP'
import string
s = 'abcdefgABCDEFGHIJKLMNOP'
s.translate(None,string.ascii_lowercase)
string.translate(s, table[, deletechars])関数は、文字のリストであるdeletecharsにある文字列からすべての文字を削除します。次に、文字列は table を使用して変換されます(この場合は使用しません)。
小文字のみを削除するには、削除する文字のリストとしてstring.ascii_lowercaseを渡す必要があります。
table
テーブルが の場合、文字削除ステップのみが実行されるため、 はなしですNone
。
高次関数が救助に!
filter(str.isupper, "abcdefgABCDEFGHIJKLMNOP")
EDIT : filter が何をするかわからない場合: filter は関数と iterable を受け取り、その関数を iterable のすべての要素に適用します。true を返すすべての値を保持し、残りはすべて破棄します。したがって、これは「ABCDEFGHIJKLMNOP」を返します。
より機能的なアプローチを使用できます
>>> s = 'abcdefgABCDEFGHIJKLMNOP'
>>> filter(str.isupper, s)
'ABCDEFGHIJKLMNOP'
または正規表現を使用します...これは簡単な答えです
import re
print ''.join(re.findall('[A-Z]+',my_string))
比較のためだけに
In [6]: %timeit filter(str.isupper,my_list)
1000 loops, best of 3: 774 us per loop
In [7]: %timeit ''.join(re.findall('[A-Z]+',my_list))
1000 loops, best of 3: 563 us per loop
In [8]: %timeit re.sub('[^A-Z]', '', my_list)
1000 loops, best of 3: 869 us per loop
In [10]: %timeit ''.join(c for c in my_list if c.isupper())
1000 loops, best of 3: 1.05 ms per loop
したがって、この join と findall は最速の方法です (ipython %timeit (python 2.6) による) で、10000 文字の長さの同一の文字列を使用します
編集:かどうか
In [12]: %timeit my_list.translate(None,string.ascii_lowercase)
10000 loops, best of 3: 51.6 us per loop