¿Cómo extraer todo SUPERIOR de una cadena? Pitón

#input my_string = 'abcdefgABCDEFGHIJKLMNOP' 

¿Cómo se extrae todo el SUPERIOR de una cadena?

 #output my_upper = 'ABCDEFGHIJKLMNOP' 

Usando la lista de comprensión:

 >>> s = 'abcdefgABCDEFGHIJKLMNOP' >>> ''.join([c for c in s if c.isupper()]) 'ABCDEFGHIJKLMNOP' 

Usando la expresión del generador:

 >>> ''.join(c for c in s if c.isupper()) 'ABCDEFGHIJKLMNOP 

También puedes hacerlo utilizando expresiones regulares:

 >>> re.sub('[^AZ]', '', s) 'ABCDEFGHIJKLMNOP' 
 import string s = 'abcdefgABCDEFGHIJKLMNOP' s.translate(None,string.ascii_lowercase) 

La función string.translate (s, table [, deletechars]) eliminará todos los caracteres de la cadena que están en deletechars , una lista de caracteres. Luego, la cadena se traducirá usando la tabla (no la estamos usando en este caso) .

Para eliminar solo las letras minúsculas, debe pasar string.ascii_lowercase como la lista de letras que se eliminarán.

La table es Ninguna porque cuando la tabla es None , solo se realizará el paso de eliminación de caracteres.

Funciones de orden superior al rescate!

 filter(str.isupper, "abcdefgABCDEFGHIJKLMNOP") 

EDITAR : En caso de que no sepa qué hace el filtro: el filtro toma una función y un iterable, y luego aplica la función a cada elemento del iterable. Mantiene todos los valores que se vuelven verdaderos y elimina todo el rest. Por lo tanto, esto devolverá “ABCDEFGHIJKLMNOP”.

o usa expresiones regulares … esta es una respuesta fácil

 import re print ''.join(re.findall('[AZ]+',my_string)) 

solo para comparación

 In [6]: %timeit filter(str.isupper,my_list) 1000 loops, best of 3: 774 us per loop In [7]: %timeit ''.join(re.findall('[AZ]+',my_list)) 1000 loops, best of 3: 563 us per loop In [8]: %timeit re.sub('[^AZ]', '', 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 

por lo tanto, join y findall es el método más rápido (por ipython% timeit (python 2.6)), utilizando una cadena idéntica de 10000 caracteres de longitud

editar : o no

 In [12]: %timeit my_list.translate(None,string.ascii_lowercase) 10000 loops, best of 3: 51.6 us per loop 

Podrías usar un enfoque más funcional.

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

aqui tienes:

 my_string = 'abcdefgABCDEFGHIJKLMNOP' cleanChar = '' for char in my_string: if char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': cleanChar = cleanChar + char newChar = cleanChar print(" {}".format(newChar))