20
#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'

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

#output
my_upper = 'ABCDEFGHIJKLMNOP'
4

7 に答える 7

7
import string
s = 'abcdefgABCDEFGHIJKLMNOP'
s.translate(None,string.ascii_lowercase)

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

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

tableテーブルが の場合、文字削除ステップのみが実行されるため、 はなしですNone

于 2013-04-08T18:34:54.733 に答える
6

高次関数が救助に!

filter(str.isupper, "abcdefgABCDEFGHIJKLMNOP")

EDIT : filter が何をするかわからない場合: filter は関数と iterable を受け取り、その関数を iterable のすべての要素に適用します。true を返すすべての値を保持し、残りはすべて破棄します。したがって、これは「ABCDEFGHIJKLMNOP」を返します。

于 2013-04-08T18:38:17.160 に答える
3

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

>>> s = 'abcdefgABCDEFGHIJKLMNOP'
>>> filter(str.isupper, s)
'ABCDEFGHIJKLMNOP'
于 2013-04-08T18:38:19.437 に答える
2

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

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
于 2013-04-08T18:35:43.573 に答える