So entfernen Sie alle Leerzeichen von der Zeichenfolge

178

Wie entferne ich alle Leerzeichen in einer Python-Zeichenfolge? Zum Beispiel möchte ich, dass aus einer Zeichenfolge strip my spacesetwas wird stripmyspaces, aber ich kann das anscheinend nicht erreichen mit strip():

>>> 'strip my spaces'.strip()
'strip my spaces'
falscher Benutzername
quelle
13
Beachten Sie, dass str.strip nur führende und nachfolgende Leerzeichen betrifft.

Antworten:

308

Nutzen Sie das Verhalten von str.split ohne sep-Parameter:

>>> s = " \t foo \n bar "
>>> "".join(s.split())
'foobar'

Wenn Sie nur Leerzeichen anstelle aller Leerzeichen entfernen möchten:

>>> s.replace(" ", "")
'\tfoo\nbar'

Vorzeitige Optimierung

Auch wenn Effizienz nicht das Hauptziel ist - das Schreiben von klarem Code ist dies -, sind hier einige erste Zeitpunkte:

$ python -m timeit '"".join(" \t foo \n bar ".split())'
1000000 loops, best of 3: 1.38 usec per loop
$ python -m timeit -s 'import re' 're.sub(r"\s+", "", " \t foo \n bar ")'
100000 loops, best of 3: 15.6 usec per loop

Beachten Sie, dass der reguläre Ausdruck zwischengespeichert ist, sodass er nicht so langsam ist, wie Sie es sich vorstellen können. Kompilieren es einige vorher hilft, würde aber in der Praxis nur aus , wenn Sie diese nennen viele Male:

$ python -m timeit -s 'import re; e = re.compile(r"\s+")' 'e.sub("", " \t foo \n bar ")'
100000 loops, best of 3: 7.76 usec per loop

Auch wenn re.sub 11,3x langsamer ist, denken Sie daran, dass Ihre Engpässe sicherlich anderswo liegen. Die meisten Programme würden den Unterschied zwischen diesen drei Optionen nicht bemerken.


quelle
Es ist wahrscheinlich langsamer als die \s+Substitution. Ich würde bei re bleiben.
OTZ
@OTZ: Sie könnten überrascht sein, aber sehen Sie die "Erinnern" -Notiz.
@ Roger Hmm. interessant. Haben Sie die s.translateMethode zufällig ausprobiert ? Es übertrifft wahrscheinlich alle auf dieser Seite gezeigten Methoden.
OTZ
@ Roger Pate: Sie brauchen nicht das Argument 'Tabelle' für die Übersetzung, es kann sein None- obwohl es überraschenderweise langsamer macht ...
Martineau
1
Versuchen Sie es myString.translate(None, " \t\r\n\v"). Es dauert nur 83% so lange wie Rogers schnellste (Split and Join) Technik. Ich bin mir nicht sicher, ob es alle Leerzeichen abdeckt, die geteilt werden, aber es wird wahrscheinlich für die meisten ASCII-Anwendungen ausreichen.
Brianmearns
60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

Behandelt auch alle Leerzeichen, an die Sie nicht denken (glauben Sie mir, es gibt viele).

Tim Yates
quelle
3
Dies ist eine viel weniger hackige Lösung als die akzeptierte Antwort.
John Smith
Dies ist expliziter als die anderen Antworten, also nimmt es den Kuchen für mich.
Tristan
34

Alternative,

"strip my spaces".translate( None, string.whitespace )

Und hier ist die Python3-Version:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))
Dan Menes
quelle
das scheint am pythonischsten. warum wurde es nicht nach oben gestimmt?
Rbp
Python 3-Code als Antwort funktioniert. Kommentar von @DanMenes ist veraltet
igo
3
NameError: name 'string' is not defined.
Zelphir Kaltstahl
@ ZelphirKaltstahl müssen Sieimport string
Shahryar Saljoughi
13

Am einfachsten ist es, replace zu verwenden:

"foo bar\t".replace(" ", "").replace("\t", "")

Verwenden Sie alternativ einen regulären Ausdruck:

import re
re.sub(r"\s", "", "foo bar\t")
Carl
quelle
8

Entfernen Sie die Startbereiche in Python

string1="    This is Test String to strip leading space"
print string1
print string1.lstrip()

Entfernen Sie die nachgestellten oder Endbereiche in Python

string2="This is Test String to strip trailing space     "
print string2
print string2.rstrip()

Entfernen Sie die whiteSpaces vom Anfang und Ende der Zeichenfolge in Python

string3="    This is Test String to strip leading and trailing space      "
print string3
print string3.strip()

Entfernen Sie alle Leerzeichen in Python

string4="   This is Test String to test all the spaces        "
print string4
print string4.replace(" ", "")
JohnSmitoff
quelle
3

Versuchen Sie eine Regex mit re.sub. Sie können nach allen Leerzeichen suchen und durch eine leere Zeichenfolge ersetzen.

\sIn Ihrem Muster werden Leerzeichen angezeigt - und nicht nur Leerzeichen (Tabulatoren, Zeilenumbrüche usw.). Sie können mehr darüber im Handbuch lesen .

Matthew Iselin
quelle
Ich weiß nicht, wie man Regexes verwendet :(
Falscher Benutzername
@wrongusername: Aktualisiert mit einem Link zur Handbuchseite des Moduls.
Matthew Iselin
2
import re
re.sub(' ','','strip my spaces')
PrabhuPrakash
quelle
3
Willkommen bei SO. Obwohl wir uns für Ihre Antwort bedanken, wäre es besser, wenn sie zusätzlich zu den anderen Antworten einen zusätzlichen Wert liefern würde. In diesem Fall bietet Ihre Antwort keinen zusätzlichen Wert, da ein anderer Benutzer diese Lösung bereits veröffentlicht hat. Wenn eine vorherige Antwort für Sie hilfreich war, sollten Sie sie abstimmen, sobald Sie genug Ruf haben
Maximilian Peters
Dies beantwortet nicht die Frage "Wie entferne ich alle Leerzeichen?". Es werden nur Leerzeichen entfernt
Nick
2

Wie von Roger Pate erwähnt, hat der folgende Code für mich funktioniert:

s = " \t foo \n bar "
"".join(s.split())
'foobar'

Ich verwende Jupyter Notebook, um folgenden Code auszuführen:

i=0
ProductList=[]
while i < len(new_list): 
   temp=''                            # new_list[i]=temp=' Plain   Utthapam  '
   #temp=new_list[i].strip()          #if we want o/p as: 'Plain Utthapam'
   temp="".join(new_list[i].split())  #o/p: 'PlainUtthapam' 
   temp=temp.upper()                  #o/p:'PLAINUTTHAPAM' 
   ProductList.append(temp)
   i=i+2
Yogesh
quelle
2

Es gelten die Standardtechniken zum Filtern einer Liste, obwohl sie nicht so effizient sind wie die Methoden split/joinoder translate.

Wir brauchen eine Reihe von Leerzeichen:

>>> import string
>>> ws = set(string.whitespace)

Das filtereingebaute:

>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'

Ein Listenverständnis (ja, verwenden Sie die Klammern: siehe Benchmark unten):

>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'

Eine Falte:

>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'

Benchmark:

>>> from timeit import timeit
>>> timeit('"".join("strip my spaces".split())')
0.17734256500003198
>>> timeit('"strip my spaces".translate(ws_dict)', 'import string; ws_dict = {ord(ws):None for ws in string.whitespace}')
0.457635745999994
>>> timeit('re.sub(r"\s+", "", "strip my spaces")', 'import re')
1.017787621000025

>>> SETUP = 'import string, operator, functools, itertools; ws = set(string.whitespace)'
>>> timeit('"".join([c for c in "strip my spaces" if c not in ws])', SETUP)
0.6484303600000203
>>> timeit('"".join(c for c in "strip my spaces" if c not in ws)', SETUP)
0.950212219999969
>>> timeit('"".join(filter(lambda c: c not in ws, "strip my spaces"))', SETUP)
1.3164566040000523
>>> timeit('"".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))', SETUP)
1.6947649049999995
jferard
quelle
0

TL / DR

Diese Lösung wurde mit Python 3.6 getestet

Um alle Leerzeichen aus einer Zeichenfolge in Python3 zu entfernen, können Sie die folgende Funktion verwenden:

def remove_spaces(in_string: str):
    return in_string.translate(str.maketrans({' ': ''})

Mit Leerzeichen können Sie Leerzeichen ('\ t \ n \ r \ x0b \ x0c') entfernen:

import string
def remove_whitespace(in_string: str):
    return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))

Erläuterung

Die Python- str.translateMethode ist eine integrierte Klassenmethode von str. Sie verwendet eine Tabelle und gibt eine Kopie der Zeichenfolge zurück, wobei jedes Zeichen durch die übergebene Übersetzungstabelle zugeordnet wird. Vollständige Dokumentation für str.translate

Zum Erstellen wird die Übersetzungstabelle str.maketransverwendet. Diese Methode ist eine weitere integrierte Klassenmethode von str. Hier verwenden wir es mit nur einem Parameter, in diesem Fall einem Wörterbuch, wobei die Schlüssel die zu ersetzenden Zeichen sind, die Werten mit dem Zeichenersetzungswert zugeordnet sind. Es gibt eine Übersetzungstabelle zur Verwendung mit zurück str.translate. Vollständige Dokumentation für str.maketrans

Das stringModul in Python enthält einige allgemeine Zeichenfolgenoperationen und Konstanten. string.whitespaceist eine Konstante, die eine Zeichenfolge zurückgibt, die alle ASCII-Zeichen enthält, die als Leerzeichen betrachtet werden. Dies umfasst den Zeichenbereich, die Registerkarte, den Zeilenvorschub, die Rückgabe, den Formularvorschub und die vertikale Registerkarte. Vollständige Dokumentation für Zeichenfolge

In der zweiten Funktion dict.fromkeyswird ein Wörterbuch erstellt, in dem die Schlüssel die Zeichen in der Zeichenfolge sind, die von string.whitespacejedem mit Wert zurückgegeben werden None. Vollständige Dokumentation für dict.fromkeys

R. Arctor
quelle
0

Wenn eine optimale Leistung keine Voraussetzung ist und Sie nur etwas ganz Einfaches wollen, können Sie eine Grundfunktion definieren, um jedes Zeichen mithilfe der in der Zeichenfolgeklasse integrierten "isspace" -Methode zu testen:

def remove_space(input_string):
    no_white_space = ''
    for c in input_string:
        if not c.isspace():
            no_white_space += c
    return no_white_space

Das Erstellen des no_white_spaceStrings auf diese Weise hat keine ideale Leistung, aber die Lösung ist leicht zu verstehen.

>>> remove_space('strip my spaces')
'stripmyspaces'

Wenn Sie keine Funktion definieren möchten, können Sie diese mit Listenverständnis in etwas vage Ähnliches konvertieren. Aus der joinLösung der Top-Antwort entlehnt:

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
nBurn
quelle