Suppression de nombres de la chaîne [fermé]

122

Comment puis-je supprimer des chiffres d'une chaîne?

user1739954
la source
19
Avec re:result = re.sub(r'[0-9]+', '', s)
Wiktor Stribiżew
avec regex, vous devrez ajouter \. aussi, comme il peut être un nombre décimal, je pense. comme result = re.sub (r '[0-9 \.] +', '', s)
GurhanCagin
1
"\d"est la même chose dans une expression régulière que "[0-9]", vous pouvez donc le faire à la result = re.sub(r"\d+", "", s)place. La vitesse dépendra probablement de la chaîne particulière utilisée, mais pour moi, cela a re.subpris environ deux fois plus de temps str.translate(légèrement plus longtemps si vous n'utilisez pas de modèle pré-compilé).
Nathan

Réponses:

186

Cela fonctionnerait-il pour votre situation?

>>> s = '12abcd405'
>>> result = ''.join([i for i in s if not i.isdigit()])
>>> result
'abcd'

Cela utilise une compréhension de liste, et ce qui se passe ici est similaire à cette structure:

no_digits = []
# Iterate through the string, adding non-numbers to the no_digits list
for i in s:
    if not i.isdigit():
        no_digits.append(i)

# Now join all elements of the list with '', 
# which puts all of the characters together.
result = ''.join(no_digits)

Comme le soulignent @AshwiniChaudhary et @KirkStrauser, vous n'avez en fait pas besoin d'utiliser les crochets dans la ligne unique, ce qui fait de l'élément entre parenthèses une expression de générateur (plus efficace qu'une compréhension de liste). Même si cela ne correspond pas aux exigences de votre mission, c'est quelque chose que vous devriez éventuellement lire :):

>>> s = '12abcd405'
>>> result = ''.join(i for i in s if not i.isdigit())
>>> result
'abcd'
RocketDonkey
la source
@SeanJohnson Génial! Je suis sûr que j'ai appris cela de quelqu'un d'autre sur ce site, donc le cycle est terminé :)
RocketDonkey
@RocketDonkey pas besoin de[]
Ashwini Chaudhary
3
Dans Python 2.7 et supérieur, vous n'avez pas besoin des crochets autour de la compréhension de la liste. Vous pouvez les laisser de côté et cela devient une expression génératrice.
Kirk Strauser
Corrigé - merci @ AshwiniChaudhary / @ KirkStrauser.
RocketDonkey
@RocketDonkey ajoute également une explication, le simple fait de voir le code n'aidera pas l'OP, je suppose.
Ashwini Chaudhary
98

Et, juste pour le jeter dans le mix, c'est le souvent oublié str.translatequi fonctionnera beaucoup plus rapidement que les boucles / expressions régulières:

Pour Python 2:

from string import digits

s = 'abc123def456ghi789zero0'
res = s.translate(None, digits)
# 'abcdefghizero'

Pour Python 3:

from string import digits

s = 'abc123def456ghi789zero0'
remove_digits = str.maketrans('', '', digits)
res = s.translate(remove_digits)
# 'abcdefghizero'
Jon Clements
la source
13
Cette approche ne fonctionnera pas dans Python3. Faites à la place: 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
valignatev
3
Meilleure solution pour Python2.
Harsh Wardhan
Ne fonctionne pas pour les chaînes de caractères Unicode
Harry M
20

Je ne sais pas si votre professeur vous autorise à utiliser des filtres mais ...

filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h")

Retour-

'aaasdffgh'

Beaucoup plus efficace que le bouclage ...

Exemple:

for i in range(10):
  a.replace(str(i),'')
Alain Nisam
la source
1
il renvoie ceci à la place: <objet de filtre à 0x03475FD0>
lone_coder
5

Et ça:

out_string = filter(lambda c: not c.isdigit(), in_string)
Pavel Paulau
la source
4
La sortie est <filter object at 0x7f749e1745c0>. Python3.6
TitanFighter
@TitanFighter Vous pouvez forcer le générateur dans un objet de liste en enveloppant cet objet retourné du filtre dans la liste (filtre (...))
ahlusar1989
5

Juste quelques-uns (d'autres en ont suggéré quelques-uns)

Méthode 1:

''.join(i for i in myStr if not i.isdigit())

Méthode 2:

def removeDigits(s):
    answer = []
    for char in s:
        if not char.isdigit():
            answer.append(char)
    return ''.join(char)

Méthode 3:

''.join(filter(lambda x: not x.isdigit(), mystr))

Méthode 4:

nums = set(map(int, range(10)))
''.join(i for i in mystr if i not in nums)

Méthode 5:

''.join(i for i in mystr if ord(i) not in range(48, 58))
inspecteurG4dget
la source
2
Il serait intéressant de montrer une comparaison d'efficacité sur ces derniers.
nu everest
2

Dites que st est votre chaîne non formatée, puis exécutez

st_nodigits=''.join(i for i in st if i.isalpha())

comme mentionné ci-dessus. Mais je suppose que vous avez besoin de quelque chose de très simple alors disons que s est votre chaîne et st_res est une chaîne sans chiffres, alors voici votre code

l = ['0','1','2','3','4','5','6','7','8','9']
st_res=""
for ch in s:
 if ch not in l:
  st_res+=ch
iddqd
la source
1

J'adorerais utiliser regex pour accomplir cela, mais puisque vous ne pouvez utiliser que des listes, des boucles, des fonctions, etc.

voici ce que j'ai trouvé:

stringWithNumbers="I have 10 bananas for my 5 monkeys!"
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!
Sean Johnson
la source
1

Si je comprends bien votre question, une façon de faire est de décomposer la chaîne en caractères, puis de vérifier chaque caractère de cette chaîne en utilisant une boucle, que ce soit une chaîne ou un nombre, puis si la chaîne, enregistrez-la dans une variable, puis une fois la boucle est terminé, affichez-le à l'utilisateur

Baahubali
la source
Une boucle for itère automatiquement à travers chaque caractère d'une chaîne, donc pas besoin de diviser la chaîne en caractères.
Ashwini Chaudhary