Entfernen Sie alle Leerzeichen in einer Zeichenfolge


788

Ich möchte alle Leerzeichen aus einer Zeichenfolge an beiden Enden und zwischen den Wörtern entfernen.

Ich habe diesen Python-Code:

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

Dadurch wird jedoch nur das Leerzeichen auf beiden Seiten der Zeichenfolge entfernt. Wie entferne ich alle Leerzeichen?


4
Wie soll Ihr Ergebnis aussehen? hello apple? helloapple?
Mark Byers

4
@ JoachimPileborg, nicht gerade denke ich, weil es auch darum geht, Leerzeichen zwischen den Wörtern zu reduzieren.
Wal-O-Mat

3
HalloApple muss meine Ausgabe sein
co2f2e

8
Korrigieren Sie mich, wenn Sie falsch liegen, aber "Leerzeichen" ist nicht gleichbedeutend mit "Leerzeichen". Die aktuelle Antwort, die als richtig markiert ist, entfernt nicht alle Leerzeichen . Aber da es als richtig markiert ist, muss es die beabsichtigte Frage beantwortet haben? Also sollten wir die Frage bearbeiten, um die akzeptierte Antwort wiederzugeben? @Kalanamith Wollten oder möchten Sie alle Leerzeichen oder nur Leerzeichen entfernen?
AnnanFay

Antworten:


1659

Wenn Sie führende und endende Leerzeichen entfernen möchten, verwenden Sie str.strip():

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

Wenn Sie alle Leerzeichen entfernen möchten, verwenden Sie str.replace():

(Hinweis: Dadurch wird nur das "normale" ASCII-Leerzeichen entfernt, ' ' U+0020jedoch kein anderes Leerzeichen. )

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

Wenn Sie doppelte Leerzeichen entfernen möchten, verwenden Sie str.split():

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'

42
Das Besondere an dieser Funktion ist, dass sie auch das '\ r \ n' aus der HTML-Datei entfernt, die ich von Beautiful Soup erhalten habe.
Lsheng

27
Ich mag "" .join (satz.split ()), dies entfernt alle Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche) von irgendwo im Satz.
Don

Anfänger hier. Kann mir jemand erklären, warum print (satz.join (satz.split ())) zu "hallo hallo appleapple" führt? Ich möchte nur verstehen, wie Code hier verarbeitet wird.
Yannis Dran

2
@YannisDran Überprüfen Sie die Dokumentation zu str.join () . Wenn Sie aufrufen sentence.join(str_list), bitten Sie Python, Elemente aus str_list sentenceals Trennzeichen zu verknüpfen .
Cédric Julien

1
"".join(sentence.split())ist in der Tat die kanonische Lösung, bei der alle Leerzeichen und nicht nur Leerzeichen effizient entfernt werden. Die ausgezeichnete Antwort von Mark Byers hätte wahrscheinlich anstelle dieser weniger zutreffenden Antwort akzeptiert werden müssen.
Cecil Curry

263

Um nur Leerzeichen zu entfernen , verwenden Sie str.replace:

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

So entfernen Sie alle Leerzeichen (Leerzeichen, Tabulator, neue Zeile, und so weiter) , die Sie verwenden können , splitdann join:

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

oder ein regulärer Ausdruck:

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

Wenn Sie nur Leerzeichen von Anfang und Ende entfernen möchten, können Sie Folgendes verwenden strip:

sentence = sentence.strip()

Sie können auch lstripLeerzeichen nur am Anfang der Zeichenfolge und rstripLeerzeichen am Ende der Zeichenfolge entfernen.


Hinweis: Sie müssen den Schritt nicht kompilieren, sondern das kompilierte Muster erneut (und Freunde) zwischenspeichern. Siehe auch Emils Antwort .
Andy Hayden

python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392

104

Eine Alternative besteht darin, reguläre Ausdrücke zu verwenden und diese seltsamen Leerzeichen ebenfalls abzugleichen. Hier sind einige Beispiele:

Entfernen Sie ALLE Leerzeichen in einer Zeichenfolge, auch zwischen Wörtern:

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

Entfernen Sie Leerzeichen am ANFANG einer Zeichenfolge:

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

Entfernen Sie Leerzeichen im ENDE einer Zeichenfolge:

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

Entfernen Sie Leerzeichen sowohl am ANFANG als auch am Ende einer Zeichenfolge:

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

NUR DUPLICATE Leerzeichen entfernen:

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

(Alle Beispiele funktionieren sowohl in Python 2 als auch in Python 3)


Funktionierte nicht für "\ u202a1234 \ u202c". Gibt die gleiche Ausgabe: u '\ u202a1234 \ u202c'
Sarang

@Sarang: Das sind keine Leerzeichen (google sie und du wirst sehen), sondern "Allgemeine Zeichensetzung". Meine Antwort befasst sich nur mit dem Entfernen von Zeichen, die als Leerzeichen klassifiziert sind.
Emil Stenström

Dies ist die einzige Lösung, die ich hier sehe, die diese verdammt lästigen Unicode-Leerzeichen entfernt, danke fam
CapnShanty

41

Whitespace enthält Leerzeichen, Tabulatoren und CRLF . Eine elegante und einzeilige String-Funktion, die wir verwenden können, ist str.translate:

Python 3

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

ODER wenn Sie gründlich sein wollen:

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

Python 2

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

ODER wenn Sie gründlich sein wollen:

import string
' hello  apple'.translate(None, string.whitespace)

2
Dies wird nicht helfen mit Unicode Whitespace wie\xc2\xa0
Suzana

5
ans.translate( None, string.whitespace )produziert nur builtins.TypeError: translate() takes exactly one argument (2 given)für mich. Docs sagt, dass das Argument eine Übersetzungstabelle ist, siehe string.maketrans (). Aber siehe Kommentar von Amnon Harel unten.
user405

2
' hello apple'.translate(str.maketrans('', '', string.whitespace))Hinweis: Es ist besser, eine Variable zum Speichern der Trans-Tabelle zu erstellen, wenn Sie dies mehrmals tun möchten.
Shogan Aversa-Druesne

16

Verwenden Sie zum Entfernen von Leerzeichen von Anfang und Ende strip.

>> "  foo bar   ".strip()
"foo bar"

1
In der Frage wird speziell darum gebeten, alle Leerzeichen und nicht nur die Enden zu entfernen. Bitte beachten Sie.
Shayan Shafiq

9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaK hat bereits oben auf die "Übersetzungs" -Methode hingewiesen. Und diese Variante funktioniert mit Python 3 (siehe diese Fragen und Antworten ).


2
Vielen Dank! Oder xxx.translate( { ord(c) :None for c in string.whitespace } )aus Gründen der Gründlichkeit.
user405

7

Achtung:

strip führt einen rstrip und einen lstrip aus (entfernt führende und nachfolgende Leerzeichen, Tabulatoren, Rückgaben und Formular-Feeds, entfernt sie jedoch nicht in der Mitte des Strings).

Wenn Sie nur Leerzeichen und Tabulatoren ersetzen, kann dies zu versteckten CRLFs führen, die anscheinend dem entsprechen, wonach Sie suchen, aber nicht identisch sind.


3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)

3
Die Frage war auch, alle Leerzeichen zu entfernen, die Tabulatoren und neue Zeilenzeichen enthalten. Dieses Snippet entfernt nur reguläre Leerzeichen.
Maximilian Peters

3

Darüber hinaus weist der Streifen einige Variationen auf:

Entfernen Sie Leerzeichen in ANFANG und ENDE einer Zeichenfolge:

sentence= sentence.strip()

Entfernen Sie Leerzeichen am ANFANG einer Zeichenfolge:

sentence = sentence.lstrip()

Entfernen Sie Leerzeichen im ENDE einer Zeichenfolge:

sentence= sentence.rstrip()

Alle drei Zeichenfolgenfunktionen strip lstripund rstripkönnen Parameter der Zeichenfolge zum Entfernen übernehmen, wobei die Standardeinstellung nur Leerzeichen ist. Dies kann hilfreich sein, wenn Sie mit etwas Bestimmtem arbeiten. Sie können beispielsweise nur Leerzeichen, aber keine Zeilenumbrüche entfernen:

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

Oder Sie können zusätzliche Kommas entfernen, wenn Sie eine Zeichenfolgenliste einlesen:

"1,2,3,".strip(",")

1

Entfernen Sie alle Leerzeichen aus einer Zeichenfolge an beiden Enden und zwischen den Wörtern.

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

Python-Dokumente:


Ich weiß, dass dies rebereits vorgeschlagen wurde, aber ich stellte fest, dass die tatsächliche Antwort auf den Fragentitel unter allen anderen Optionen etwas verborgen war.
Behandle den
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.