¿Cómo filtrar una cadena para que solo contenga letras?

¿Cómo hago una función donde filtre todas las letras que no son de la cadena? Por ejemplo, las letters("jajk24me") devolverán "jajkme" . (Debe ser un bucle for) y la función string.isalpha() me ayudará con esto?

Mi bash:

 def letters(input): valids = [] for character in input: if character in letters: valids.append( character) return (valids) 

Si tiene que estar en ese bucle for, y una expresión regular no funciona, entonces esta pequeña modificación de su bucle funcionará:

 def letters(input): valids = [] for character in input: if character.isalpha(): valids.append(character) return ''.join(valids) 

(El ''.join(valids) al final toma todos los caracteres que ha reunido en una lista y los une en una cadena. Su función original devolvió esa lista de caracteres)

También puedes filtrar los caracteres de una cadena:

 def letters(input): return ''.join(filter(str.isalpha, input)) 

o con una lista de comprensión:

 def letters(input): return ''.join([c for c in input if c.isalpha()]) 

o podrías usar una expresión regular, como otros han sugerido.

 import re valids = re.sub(r"[^A-Za-z]+", '', my_string) 

EDITAR: Si necesita ser un bucle for, algo como esto debería funcionar:

 output = '' for character in input: if character.isalpha(): output += character 

Consulte re.sub , para rendimiento, considere re.compile para optimizar el patrón una vez.
A continuación encontrará una versión corta que coincide con todos los caracteres que no están en el rango de la A a la Z y los reemplaza por la cadena vacía. El indicador re.I ignora el caso, por lo que también se reemplazan los caracteres en minúscula ( az ).

 import re def charFilter(myString) return re.sub('^[AZ]*', '', myString, 0, re.I) 

Si realmente necesitas ese bucle hay muchos creadores, explicándolos específicamente. Sin embargo, es posible que desee dar una razón por la que necesita un bucle.

Si desea operar en las secuencias numéricas y ese es el motivo del bucle, considere reemplazar el parámetro de cadena de reemplazo con una función como:

 import re def numberPrinter(matchString) { print(matchString) return '' } def charFilter(myString) return re.sub('^[AZ]*', '', myString, 0, re.I) 

El método string.isalpha () verifica si la cadena consta de caracteres alfabéticos solamente. Puede usarlo para verificar si se necesita alguna modificación. En cuanto a la otra parte de la pregunta, pst es la correcta. Puedes leer sobre expresiones regulares en el documento de python: http://docs.python.org/library/re.html Pueden parecer desalentadoras, pero son realmente útiles una vez que aprendes a entenderlas.

Por supuesto que puedes usar isalpha . Además, los valids pueden ser una cadena.

Aqui tienes:

 def letters(input): valids = "" for character in input: if character.isalpha(): valids += character return valids 

No usar un for-loop. Pero eso ya ha sido completamente cubierto.

Puede que sea un poco tarde, y no estoy seguro del rendimiento, pero solo pensé en esta solución que parece bastante ingeniosa:

 set(x).intersection(y) 

Podrías usarlo como:

 from string import ascii_letters def letters(string): return ''.join(set(string).intersection(ascii_letters)) 

NOTA: Esto no conservará el orden lineal. Lo cual en mi caso de uso está bien, pero ten cuidado .