8 votes

Comment filtrer une chaîne de caractères pour ne contenir que des lettres?

Comment puis-je créer une fonction qui filtrera toutes les lettres non alphabétiques de la chaîne de caractères ? Par exemple, letters("jajk24me") renverra "jajkme". (Il doit s'agir d'une boucle for) et la fonction string.isalpha() m'aidera-t-elle avec ceci ?

Ma tentative:

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

24voto

Ian Clelland Points 15066

Si cela doit être dans cette boucle for, et qu'une expression régulière ne fonctionnera pas, alors cette petite modification de votre boucle fonctionnera :

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

(Le ''.join(valids) à la fin prend tous les caractères que vous avez collectés dans une liste, et les joint ensemble dans une chaîne de caractères. Votre fonction d'origine retournait plutôt cette liste de caractères)

Vous pouvez également filtrer les caractères d'une chaîne :

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

ou avec une compréhension de liste :

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

ou vous pourriez utiliser une expression régulière, comme d'autres l'ont suggéré.

10voto

skunkfrukt Points 1482
import re
valides = re.sub(r"[^A-Za-z]+", '', ma_chaine)

EDIT: Si cela doit être une boucle for, quelque chose comme ceci devrait fonctionner:

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

4voto

ted Points 1517

Voir re.sub, pour des performances, considérez un re.compile pour optimiser le motif une fois.
Ci-dessous, vous trouverez une version courte qui correspond à tous les caractères qui ne sont pas dans la plage de A à Z et les remplace par une chaîne vide. Le drapeau re.I ignore la casse, donc aussi les caractères minuscules (a-z) sont remplacés.

import re

def charFilter(myString)
    return re.sub('[^A-Z]+', '', myString, 0, re.I)

Si vous avez vraiment besoin de cette boucle, il existe de nombreuses réponses, expliquant cela spécifiquement. Cependant, vous voudrez peut-être donner une raison pour laquelle vous avez besoin d'une boucle.

Si vous souhaitez opérer sur les séquences de nombres et c'est la raison de la boucle, envisagez de remplacer le paramètre de la chaîne de remplacement par une fonction comme :

import re

def numberPrinter(matchString) {
     print(matchString)
     return ''
}

def charFilter(myString)
    return re.sub('[^A-Z]+', '', myString, 0, re.I)

0voto

Askr Points 57

La méthode string.isalpha() vérifie si la chaîne contient uniquement des caractères alphabétiques. Vous pouvez l'utiliser pour vérifier si une modification est nécessaire. En ce qui concerne l'autre partie de la question, pst a tout à fait raison. Vous pouvez en apprendre davantage sur les expressions régulières dans la documentation python : http://docs.python.org/library/re.html. Elles peuvent sembler intimidantes au début, mais sont vraiment utiles une fois que vous les maîtrisez.

0voto

Prasanth Points 4177

Bien sûr, vous pouvez utiliser isalpha. De plus, valids peut être une chaîne de caractères.

Voici :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X