Wie schneide ich Leerzeichen aus einer Zeichenfolge?

1156

Wie entferne ich führende und nachfolgende Leerzeichen aus einer Zeichenfolge in Python?

Zum Beispiel:

" Hello " --> "Hello"
" Hello"  --> "Hello"
"Hello "  --> "Hello"
"Bob has a cat" --> "Bob has a cat"
Georgy
quelle
17
Bei dieser Frage habe ich gerade mit Kollegen von der Arbeit über das Strippen für 3 Minuten gesprochen. Für alle anderen, die auf halbem Weg mitmachen, hätten sie gedacht, wir wären alle ein bisschen Nachtjobs.
Whitecat

Antworten:

1736

Nur ein Leerzeichen oder alle aufeinander folgenden Leerzeichen? Wenn die zweite, dann haben Zeichenfolgen bereits eine .strip()Methode:

>>> ' Hello '.strip()
'Hello'
>>> ' Hello'.strip()
'Hello'
>>> 'Bob has a cat'.strip()
'Bob has a cat'
>>> '   Hello   '.strip()  # ALL consecutive spaces at both ends removed
'Hello'

Wenn Sie jedoch nur ein Leerzeichen entfernen müssen, können Sie dies tun mit:

def strip_one_space(s):
    if s.endswith(" "): s = s[:-1]
    if s.startswith(" "): s = s[1:]
    return s

>>> strip_one_space("   Hello ")
'  Hello'

Beachten Sie auch, dass auch str.strip()andere Leerzeichen entfernt werden (z. B. Tabulatoren und Zeilenumbrüche). Um nur Leerzeichen zu entfernen, können Sie das zu entfernende Zeichen als Argument angeben strip, z.

>>> "  Hello\n".strip(" ")
'Hello\n'
Brian
quelle
19
Wenn Sie die Strip-Funktion benötigen, zum Beispiel eine Map-Funktion, können Sie über str.strip () darauf zugreifen, wie auf map (str.strip, collection_of_s)
Ward
1
Gibt es eine Möglichkeit, nur die Leerzeichen an den Enden zu kürzen?
Nikhil Girraj
2
@killthrush Danke für den Hinweis, aber ich denke du meintest die rstrip()Funktion. :-)
Nikhil Girraj
14
Manchmal fühle ich mich wie absichtlich Python die gut angenommen und aussagekräftige Namen vermeidet , dass die überwiegende Mehrheit der Sprachen verwenden , um „einzigartig“ und „anders“ zu sein - stripstatt trim, isinstancestatt instanceof, liststatt array, etc, etc. Warum nicht einfach Gebrauch die Namen, mit denen jeder vertraut ist? Meine Güte: P
Gershom
3
@GershomMaes in diesem stripFall stimme ich voll und ganz zu, aber eine Liste unterscheidet sich völlig von einem Array.
JFA
262

Wie in den obigen Antworten ausgeführt

myString.strip()

entfernt alle führenden und nachfolgenden Leerzeichen wie \ n, \ r, \ t, \ f, Leerzeichen.

Verwenden Sie für mehr Flexibilität Folgendes

  • Entfernt nur führende Leerzeichen:myString.lstrip()
  • Entfernt nur nachgestellte Leerzeichen:myString.rstrip()
  • Entfernt bestimmte Leerzeichen: myString.strip('\n')oder myString.lstrip('\n\r')oder myString.rstrip('\n\t')so weiter.

Weitere Details finden Sie in den Dokumenten

Mudit Jain
quelle
Ich glaube, ist \ r \ n nicht \ n \ r ... (kann den Beitrag nicht bearbeiten - nicht genug Zeichen geändert)
StefanNch
8
@StefanNch: Die Reihenfolge der Zeichen spielt überhaupt keine Rolle. \ n \ r entfernt auch \ r \ n.
Johannes Overmann
122

strip ist auch nicht auf Leerzeichen beschränkt:

# remove all leading/trailing commas, periods and hyphens
title = title.strip(',.-')
Drew Noakes
quelle
54

Dadurch werden alle führenden und nachfolgenden Leerzeichen entfernt in myString:

myString.strip()
Deniz Dogan
quelle
3
Dieser Beitrag enthält nur Code und erklärt nicht, was die Funktion tut. Entfernt es führende oder nachfolgende Leerzeichen oder beides? Entfernt es nur Leerzeichen oder jede Art von Leerzeichen? Können Sie dafür sorgen, dass nur Leerzeichen entfernt werden, oder gibt es eine andere Funktion, um dies zu tun? Wenn sowohl führende als auch nachfolgende Leerzeichen entfernt werden, können Sie dann nur eine der beiden entfernen, oder gibt es (eine) andere Funktion (en), um die Aufgabe zu erledigen? myString.strip()beantwortet keine der Fragen, die ich gestellt habe.
EKons
8
Um fair zu sein, hat OP speziell nach einer Methode gefragt, mit der führende und nachfolgende Leerzeichen aus einer Zeichenfolge entfernt werden. Gute Antwort auf mich
Denis Lins
21

Du willst strip ():

myphrases = [ " Hello ", " Hello", "Hello ", "Bob has a cat" ]

for phrase in myphrases:
    print phrase.strip()
vezult
quelle
0

Ich wollte die zu vielen Leerzeichen in einer Zeichenfolge entfernen (auch zwischen den Zeichenfolgen, nicht nur am Anfang oder Ende). Ich habe das gemacht, weil ich nicht weiß, wie ich es anders machen soll:

string = "Name : David         Account: 1234             Another thing: something  " 

ready = False
while ready == False:
    pos = string.find("  ")
    if pos != -1:
       string = string.replace("  "," ")
    else:
       ready = True
print(string)

Dies ersetzt doppelte Leerzeichen in einem Leerzeichen, bis Sie keine doppelten Leerzeichen mehr haben

Marjan
quelle
Obwohl dies funktioniert, ist es nicht sehr effizient, verwenden Sie stattdessen: stackoverflow.com/a/2077906/1240286
Arklur
0

Ich konnte keine Lösung für das finden, wonach ich suchte, also habe ich einige benutzerdefinierte Funktionen erstellt. Sie können sie ausprobieren.

def cleansed(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    # return trimmed(s.replace('"', '').replace("'", ""))
    return trimmed(s)


def trimmed(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    ss = trim_start_and_end(s).replace('  ', ' ')
    while '  ' in ss:
        ss = ss.replace('  ', ' ')
    return ss


def trim_start_and_end(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    return trim_start(trim_end(s))


def trim_start(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    chars = []
    for c in s:
        if c is not ' ' or len(chars) > 0:
            chars.append(c)
    return "".join(chars).lower()


def trim_end(s: str):
    """:param s: String to be cleansed"""
    assert s is not (None or "")
    chars = []
    for c in reversed(s):
        if c is not ' ' or len(chars) > 0:
            chars.append(c)
    return "".join(reversed(chars)).lower()


s1 = '  b Beer '
s2 = 'Beer  b    '
s3 = '      Beer  b    '
s4 = '  bread butter    Beer  b    '

cdd = trim_start(s1)
cddd = trim_end(s2)
clean1 = cleansed(s3)
clean2 = cleansed(s4)

print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s1, len(s1), cdd, len(cdd)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s2, len(s2), cddd, len(cddd)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s3, len(s3), clean1, len(clean1)))
print("\nStr: {0} Len: {1} Cleansed: {2} Len: {3}".format(s4, len(s4), clean2, len(clean2)))
Mitch
quelle
0

Wenn Sie die angegebene Anzahl von Leerzeichen von links und rechts kürzen möchten , können Sie dies tun:

def remove_outer_spaces(text, num_of_leading, num_of_trailing):
    text = list(text)
    for i in range(num_of_leading):
        if text[i] == " ":
            text[i] = ""
        else:
            break

    for i in range(1, num_of_trailing+1):
        if text[-i] == " ":
            text[-i] = ""
        else:
            break
    return ''.join(text)

txt1 = "   MY name is     "
print(remove_outer_spaces(txt1, 1, 1))  # result is: "  MY name is    "
print(remove_outer_spaces(txt1, 2, 3))  # result is: " MY name is  "
print(remove_outer_spaces(txt1, 6, 8))  # result is: "MY name is"
Dounchan
quelle
0

Dies kann auch mit einem regulären Ausdruck erfolgen

import re

input  = " Hello "
output = re.sub(r'^\s+|\s+$', '', input)
# output = 'Hello'
James McGuigan
quelle
0

Wie entferne ich führende und nachfolgende Leerzeichen aus einer Zeichenfolge in Python?

Die folgende Lösung entfernt also führende und nachfolgende Leerzeichen sowie mittlere Leerzeichen. Zum Beispiel, wenn Sie eindeutige Zeichenfolgenwerte ohne mehrere Leerzeichen erhalten müssen.

>>> str_1 = '     Hello World'
>>> print(' '.join(str_1.split()))
Hello World
>>>
>>>
>>> str_2 = '     Hello      World'
>>> print(' '.join(str_2.split()))
Hello World
>>>
>>>
>>> str_3 = 'Hello World     '
>>> print(' '.join(str_3.split()))
Hello World
>>>
>>>
>>> str_4 = 'Hello      World     '
>>> print(' '.join(str_4.split()))
Hello World
>>>
>>>
>>> str_5 = '     Hello World     '
>>> print(' '.join(str_5.split()))
Hello World
>>>
>>>
>>> str_6 = '     Hello      World     '
>>> print(' '.join(str_6.split()))
Hello World
>>>
>>>
>>> str_7 = 'Hello World'
>>> print(' '.join(str_7.split()))
Hello World

Wie Sie sehen können, werden dadurch alle mehreren Leerzeichen in der Zeichenfolge entfernt (Ausgabe ist Hello Worldfür alle). Die Lage spielt keine Rolle. Aber wenn Sie wirklich führende und nachfolgende Leerzeichen benötigen, dann sind Sie hier genau richtig strip().

Kushan Gunasekera
quelle