#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'
文字列からすべてのUPPERをどのように抽出しますか?
#output
my_upper = 'ABCDEFGHIJKLMNOP'
リスト内包表記の使用:
>>> s = 'abcdefgABCDEFGHIJKLMNOP'
>>> ''.join([c for c in s if c.isupper()])
'ABCDEFGHIJKLMNOP'
ジェネレータ式の使用:
>>> ''.join(c for c in s if c.isupper())
'ABCDEFGHIJKLMNOP
正規表現を使用してそれを行うこともできます。
>>> re.sub('[^A-Z]', '', s)
'ABCDEFGHIJKLMNOP'
import string
s = 'abcdefgABCDEFGHIJKLMNOP'
s.translate(None,string.ascii_lowercase)
string.translate(s、table [、deletechars]) 関数は、deletecharsにある文字列からすべての文字を削除します。文字のリスト。次に、文字列はテーブルを使用して変換されます(この場合は使用しません)。
小文字のみを削除するには、削除する文字のリストとして string.ascii_lowercase を渡す必要があります。
テーブルがtable
の場合、文字の削除手順のみが実行されるため、None
はNoneです。
高階関数が救助に!
filter(str.isupper, "abcdefgABCDEFGHIJKLMNOP")
[〜#〜] edit [〜#〜]:filterの機能がわからない場合:filterは関数とイテラブルを受け取り、イテラブル内のすべての要素に関数を適用します。 trueを返すすべての値を保持し、残りのすべてを破棄します。したがって、これは「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
したがって、この結合とfindallは、10000文字の長さの同一の文字列を使用する最速の方法です(ipython%timeit(python 2.6)ごと)。
編集:かどうか
In [12]: %timeit my_list.translate(None,string.ascii_lowercase)
10000 loops, best of 3: 51.6 us per loop
より機能的なアプローチを使用できます
>>> s = 'abcdefgABCDEFGHIJKLMNOP'
>>> filter(str.isupper, s)
'ABCDEFGHIJKLMNOP'
どうぞ:
my_string = 'abcdefgABCDEFGHIJKLMNOP'
cleanChar = ''
for char in my_string:
if char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
cleanChar = cleanChar + char
newChar = cleanChar
print(" {}".format(newChar))