Supprimer tous les espaces dans une chaîne

789

Je veux éliminer tous les espaces blancs d'une chaîne, aux deux extrémités et entre les mots.

J'ai ce code Python:

def my_handle(self):
    sentence = ' hello  apple  '
    sentence.strip()

Mais cela n'élimine que les espaces des deux côtés de la chaîne. Comment supprimer tous les espaces?

co2f2e
la source
4
À quoi devrait ressembler votre résultat? hello apple? helloapple?
Mark Byers
4
@JoachimPileborg, pas exactement je pense, car il s'agit aussi de réduire les espaces entre les mots.
wal-o-mat
3
helloapple doit être ma sortie
co2f2e
8
Corrigez-moi si je me trompe, mais "espaces blancs" n'est pas synonyme de "caractères d'espacement". La réponse actuelle marquée comme correcte ne supprime pas tous les espaces . Mais, comme il est marqué comme correct, il doit avoir répondu à la question voulue? Nous devrions donc modifier la question pour refléter la réponse acceptée? @Kalanamith Souhaitez-vous ou voulez-vous supprimer tous les espaces ou uniquement les espaces?
AnnanFay

Réponses:

1661

Si vous souhaitez supprimer les espaces de début et de fin, utilisez str.strip():

sentence = ' hello  apple'
sentence.strip()
>>> 'hello  apple'

Si vous souhaitez supprimer tous les caractères d'espace, utilisez str.replace():

(NB cela ne supprime que le caractère d'espace ASCII «normal» ' ' U+0020mais pas les autres espaces )

sentence = ' hello  apple'
sentence.replace(" ", "")
>>> 'helloapple'

Si vous souhaitez supprimer les espaces dupliqués, utilisez str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'
Cédric Julien
la source
42
La grandeur de cette fonction est qu'elle supprime également le '\ r \ n' du fichier html que j'ai reçu de Beautiful Soup.
lsheng
27
J'aime "" .join (phrase.split ()), cela supprime tous les espaces (espaces, tabulations, sauts de ligne) de n'importe où dans la phrase.
don
mendiant ici. Quelqu'un peut-il m'expliquer pourquoi print (sentence.join (sentence.split ())) se traduit par «bonjour bonjour appleapple»? Je veux juste comprendre comment le code est traité ici.
Yannis Dran
2
@YannisDran consultez la documentation str.join () , lorsque vous appelez, sentence.join(str_list)vous demandez à python de joindre les éléments de str_list avec sentencecomme séparateur.
Cédric Julien
1
"".join(sentence.split())est en effet la solution canonique, supprimant efficacement tous les espaces plutôt que simplement les espaces. L' excellente réponse de Mark Byers aurait probablement dû être acceptée à la place de cette réponse moins applicable.
Cecil Curry
263

Pour supprimer uniquement les espaces, utilisez str.replace:

sentence = sentence.replace(' ', '')

Pour supprimer tous les caractères d' espacement (espace, tabulation, retour à la ligne, etc.), vous pouvez utiliser splitensuite join:

sentence = ''.join(sentence.split())

ou une expression régulière:

import re
pattern = re.compile(r'\s+')
sentence = re.sub(pattern, '', sentence)

Si vous souhaitez supprimer uniquement les espaces blancs du début et de la fin, vous pouvez utiliser strip:

sentence = sentence.strip()

Vous pouvez également utiliser lstrippour supprimer les espaces uniquement au début de la chaîne et rstrippour supprimer les espaces à la fin de la chaîne.

Mark Byers
la source
Remarque: Vous n'avez pas besoin de compiler l'étape, re.sub (et vos amis) mettent en cache le modèle compilé. Voir aussi, la réponse d'Emil .
Andy Hayden
python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392
104

Une alternative consiste à utiliser des expressions régulières et à faire correspondre ces étranges espaces blancs également. Voici quelques exemples:

Supprimez TOUS les espaces d'une chaîne, même entre les mots:

import re
sentence = re.sub(r"\s+", "", sentence, flags=re.UNICODE)

Supprimez les espaces au DÉBUT d'une chaîne:

import re
sentence = re.sub(r"^\s+", "", sentence, flags=re.UNICODE)

Supprimez les espaces à la fin d'une chaîne:

import re
sentence = re.sub(r"\s+$", "", sentence, flags=re.UNICODE)

Supprimez les espaces à la fois au début et à la fin d'une chaîne:

import re
sentence = re.sub("^\s+|\s+$", "", sentence, flags=re.UNICODE)

Supprimez UNIQUEMENT les espaces EN DOUBLE:

import re
sentence = " ".join(re.split("\s+", sentence, flags=re.UNICODE))

(Tous les exemples fonctionnent à la fois en Python 2 et Python 3)

Emil Stenström
la source
N'a pas fonctionné pour "\ u202a1234 \ u202c". Donne la même sortie: u '\ u202a1234 \ u202c'
Sarang
@Sarang: Ce ne sont pas des espaces (google et vous verrez) mais "Ponctuation générale". Ma réponse ne concerne que la suppression des caractères classés comme espaces blancs.
Emil Stenström
C'est la seule solution que je vois ici qui supprime ces satanés caractères blancs unicode embêtants, merci fam
CapnShanty
41

L' espace comprend l' espace, les tabulations et le CRLF . Donc, une fonction de chaîne élégante et à une ligne que nous pouvons utiliser est str.translate:

Python 3

' hello  apple'..translate(str.maketrans('', '', ' \n\t\r'))

OU si vous voulez être minutieux:

import string
' hello  apple'..translate(str.maketrans('', '', string.whitespace))

Python 2

' hello  apple'.translate(None, ' \n\t\r')

OU si vous voulez être minutieux:

import string
' hello  apple'.translate(None, string.whitespace)
MaK
la source
2
Cela n'aidera pas avec les espaces blancs Unicode comme\xc2\xa0
Suzana
5
ans.translate( None, string.whitespace )ne produit que builtins.TypeError: translate() takes exactly one argument (2 given)pour moi. Docs dit que cet argument est une table de traduction, voir string.maketrans (). Mais voir le commentaire d'Amnon Harel, ci-dessous.
user405
2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Remarque: il vaut mieux faire une variable pour stocker la trans-table si vous avez l'intention de le faire plusieurs fois.
Shogan Aversa-Druesne
16

Pour supprimer les espaces du début et de la fin, utilisez strip.

>> "  foo bar   ".strip()
"foo bar"
wal-o-mat
la source
1
La question demande spécifiquement de supprimer tous les espaces blancs et pas seulement aux extrémités. Veuillez en prendre note.
Shayan Shafiq
9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK a déjà souligné la méthode "translate" ci-dessus. Et cette variation fonctionne avec Python 3 (voir cette Q&R ).

Amnon Harel
la source
2
Merci! Ou, xxx.translate( { ord(c) :None for c in string.whitespace } )pour plus de minutie.
user405
7

Faites attention:

strip effectue un rstrip et un lstrip (supprime les espaces de début et de fin, les tabulations, les retours et les formulaires, mais il ne les supprime pas au milieu de la chaîne).

Si vous remplacez uniquement les espaces et les tabulations, vous pouvez vous retrouver avec des CRLF cachés qui semblent correspondre à ce que vous recherchez, mais qui ne sont pas les mêmes.

yan bellavance
la source
3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)
PrabhuPrakash
la source
3
la question était trop de supprimer tous les espaces blancs qui incluent les tabulations et les nouveaux caractères de ligne, cet extrait ne supprimera que les espaces réguliers.
Maximilian Peters
3

De plus, la bande a quelques variantes:

Supprimez les espaces au début et à la fin d'une chaîne:

sentence= sentence.strip()

Supprimez les espaces au DÉBUT d'une chaîne:

sentence = sentence.lstrip()

Supprimez les espaces à la fin d'une chaîne:

sentence= sentence.rstrip()

Les trois fonctions de chaîne strip lstripet rstrippeuvent prendre les paramètres de la chaîne à supprimer, la valeur par défaut étant tout l'espace blanc. Cela peut être utile lorsque vous travaillez avec quelque chose de particulier, par exemple, vous pouvez supprimer uniquement les espaces mais pas les retours à la ligne:

" 1. Step 1\n".strip(" ")

Ou vous pouvez supprimer des virgules supplémentaires lors de la lecture dans une liste de chaînes:

"1,2,3,".strip(",")
Anna
la source
1

éliminer tous les espaces d'une chaîne, aux deux extrémités et entre les mots.

>>> import re
>>> re.sub("\s+", # one or more repetition of whitespace
    '', # replace with empty string (->remove)
    ''' hello
...    apple
... ''')
'helloapple'

Documents Python:

manipuler
la source
Je sais que cela rea déjà été suggéré, mais j'ai trouvé que la réponse réelle au titre de la question était un peu cachée parmi toutes les autres options.
gérer