#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'
如何从字符串中提取所有UPPER?
#output
my_upper = 'ABCDEFGHIJKLMNOP'
答案 0 :(得分:26)
使用列表理解:
>>> 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'
答案 1 :(得分:7)
import string
s = 'abcdefgABCDEFGHIJKLMNOP'
s.translate(None,string.ascii_lowercase)
string.translate(s, table[, deletechars])函数将删除 deletechars (字符列表)中字符串中的所有字符。然后,字符串将使用表进行翻译(在这种情况下我们不使用它)。
要仅删除小写字母,您需要将string.ascii_lowercase作为要删除的字母列表。
table
为无,因为当表格为None
时,只会执行字符删除步骤。
答案 2 :(得分:6)
高阶职能救援!
filter(str.isupper, "abcdefgABCDEFGHIJKLMNOP")
编辑:如果你不知道过滤器做了什么:filter接受一个函数和一个iterable,然后将该函数应用于iterable中的每个元素。它保留所有返回true的值,并抛弃所有其余值。因此,这将返回“ABCDEFGHIJKLMNOP”。
答案 3 :(得分: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
答案 4 :(得分:2)
您可以使用更实用的方法
>>> s = 'abcdefgABCDEFGHIJKLMNOP'
>>> filter(str.isupper, s)
'ABCDEFGHIJKLMNOP'
答案 5 :(得分:0)
你去:
my_string = 'abcdefgABCDEFGHIJKLMNOP'
cleanChar = ''
for char in my_string:
if char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
cleanChar = cleanChar + char
newChar = cleanChar
print(" {}".format(newChar))
答案 6 :(得分:0)
for char in my_string:
if char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
print(char)