Question

J'essaie de supprimer tous les chiffres d'une chaîne. Cependant, le code suivant supprime également les chiffres contenus dans n'importe quel mot, et évidemment, je ne le souhaite pas. J'ai essayé de nombreuses expressions régulières sans succès.

Merci!

s = "This must not b3 delet3d, but the number at the end yes 134411"
s = re.sub("\d+", "", s)
print s

Résultat:

  

Ceci ne doit pas être supprimé, mais le nombre à la fin oui

Était-ce utile?

La solution

Ajouter un espace avant le \ d +.

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> s = re.sub(" \d+", " ", s)
>>> s
'This must not b3 delet3d, but the number at the end yes '

Modifier: Après avoir consulté les commentaires, j’ai décidé de formuler une réponse plus complète. Je pense que cela représente tous les cas.

s = re.sub("^\d+\s|\s\d+\s|\s\d+<*>quot;, " ", s)

Autres conseils

Essayez ceci:

"\b\d+\b"

Cela correspond uniquement aux chiffres qui ne font pas partie d'un autre mot.

L'utilisation de \ s n'est pas très efficace, car elle ne gère pas les tabulations, etc. Une première solution à une meilleure solution est la suivante:

re.sub(r"\b\d+\b", "", s)

Notez que le modèle est une chaîne brute car \ b est normalement l'échappement arrière pour les chaînes et que nous voulons plutôt échapper à la limite de mots spéciale regex. Une version légèrement plus sophistiquée est:

re.sub(r"$\d+\W+|\b\d+\b|\W+\d+<*>quot;, "", s)

Qui essaie de supprimer les espaces de début / fin lorsqu'il y a des chiffres au début / à la fin de la chaîne. Je dis " tente " parce que s'il y a plusieurs numéros à la fin, vous avez encore des espaces.

Pour gérer également les chaînes de chiffres au début d'une ligne:

s = re.sub(r"(^|\W)\d+", "", s)

Si votre numéro est toujours à la fin de vos chaînes, essayez: re ("\ d + $", "", s)

sinon, vous pouvez essayer re ("(\ s) \ d + (\ s)", "\ 1 \ 2", s)

Vous pouvez ajuster les références arrière pour ne conserver qu'un ou deux des espaces (\ s correspond à tout séparateur de blanc)

Solution non regex:

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> " ".join([x for x in s.split(" ") if not x.isdigit()])
'This must not b3 delet3d, but the number at the end yes'

Divise par " "" et vérifie si le bloc est un nombre en effectuant < code> str (). isdigit () , puis les associe à nouveau. Plus verbalement (sans utiliser une compréhension de liste):

words = s.split(" ")
non_digits = []
for word in words:
    if not word.isdigit():
        non_digits.append(word)

" ".join(non_digits)

Je ne sais pas à quoi ressemble votre situation réelle, mais la plupart des réponses donnent l'impression qu'elles ne gèreront pas les nombres négatifs ou les nombres décimaux,

re.sub (r "(\ b | \ s + \ -? | ^ \ -?) (\ d + | \ d * \. \ d +) \ b", """)

Ce qui précède devrait également gérer des choses comme

"Cela ne doit pas être b3 delet3d, mais le nombre à la fin oui -134.411"

Mais cela reste incomplet - vous avez probablement besoin d'une définition plus complète de ce que vous pouvez vous attendre à trouver dans les fichiers à analyser.

Éditer: il est également intéressant de noter que '\ b' change en fonction de la locale / du jeu de caractères que vous utilisez, vous devez donc faire attention à cela.

Vous pouvez essayer ceci

s = "This must not b3 delet3d, but the number at the end yes 134411"
re.sub("(\s\d+)","",s) 

résultat:

'This must not b3 delet3d, but the number at the end yes'

la même règle s'applique également à

s = "This must not b3 delet3d, 4566 but the number at the end yes 134411" 
re.sub("(\s\d+)","",s) 

résultat:

<*>
>>>s = "This must not b3 delet3d, but the number at the end yes 134411"
>>>s = re.sub(r"\d*<*>quot;, "", s)
>>>s

"Ceci ne doit pas être b3 delet3d, mais le nombre à la fin oui"

Ceci supprimera les numériques à la fin de la chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top