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 ifnot 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 listfor i in s:ifnot 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 ifnot i.isdigit())>>> result'abcd'
@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.
@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'
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 notin l:
st_res+=ch
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 notin map(str,range(0,10))else""for c in stringWithNumbers)print(stringWithoutNumbers)#I have bananas for my monkeys!
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
re
:result = re.sub(r'[0-9]+', '', s)
"\d"
est la même chose dans une expression régulière que"[0-9]"
, vous pouvez donc le faire à laresult = re.sub(r"\d+", "", s)
place. La vitesse dépendra probablement de la chaîne particulière utilisée, mais pour moi, cela are.sub
pris environ deux fois plus de tempsstr.translate
(légèrement plus longtemps si vous n'utilisez pas de modèle pré-compilé).Réponses:
Cela fonctionnerait-il pour votre situation?
Cela utilise une compréhension de liste, et ce qui se passe ici est similaire à cette structure:
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 :):
la source
[]
Et, juste pour le jeter dans le mix, c'est le souvent oublié
str.translate
qui fonctionnera beaucoup plus rapidement que les boucles / expressions régulières:Pour Python 2:
Pour Python 3:
la source
'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
Je ne sais pas si votre professeur vous autorise à utiliser des filtres mais ...
Retour-
Beaucoup plus efficace que le bouclage ...
Exemple:
la source
Et ça:
la source
<filter object at 0x7f749e1745c0>
. Python3.6Juste quelques-uns (d'autres en ont suggéré quelques-uns)
Méthode 1:
Méthode 2:
Méthode 3:
Méthode 4:
Méthode 5:
la source
Dites que st est votre chaîne non formatée, puis exécutez
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
la source
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é:
la source
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
la source