web-dev-qa-db-ja.com

文字列からすべてのUPPERを抽出するにはどうすればよいですか? Python

#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'

文字列からすべてのUPPERをどのように抽出しますか?

#output
my_upper = 'ABCDEFGHIJKLMNOP'
16
O.rka

リスト内包表記の使用:

>>> 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'
31
piokuc
import string
s = 'abcdefgABCDEFGHIJKLMNOP'
s.translate(None,string.ascii_lowercase)

string.translate(s、table [、deletechars]) 関数は、deletecharsにある文字列からすべての文字を削除します。文字のリスト。次に、文字列はテーブルを使用して変換されます(この場合は使用しません)

小文字のみを削除するには、削除する文字のリストとして string.ascii_lowercase を渡す必要があります。

テーブルがtableの場合、文字の削除手順のみが実行されるため、NoneはNoneです。

7
herinkc

高階関数が救助に!

filter(str.isupper, "abcdefgABCDEFGHIJKLMNOP")

[〜#〜] edit [〜#〜]:filterの機能がわからない場合:filterは関数とイテラブルを受け取り、イテラブル内のすべての要素に関数を適用します。 trueを返すすべての値を保持し、残りのすべてを破棄します。したがって、これは「ABCDEFGHIJKLMNOP」を返します。

6
hatkirby

または正規表現を使用してください...これは簡単な答えです

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
2
Joran Beasley

より機能的なアプローチを使用できます

>>> s = 'abcdefgABCDEFGHIJKLMNOP'
>>> filter(str.isupper, s)
'ABCDEFGHIJKLMNOP'
2
Finn

どうぞ:

my_string = 'abcdefgABCDEFGHIJKLMNOP'

cleanChar = ''

for char in my_string:
    if char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
        cleanChar = cleanChar + char

newChar = cleanChar
print(" {}".format(newChar))
0
user9830600