web-dev-qa-db-de.com

Entfernen Sie Leerzeichen in Python mit string.whitespace

Pythons string.whitespace ist großartig:

>>> string.whitespace
'\t\n\x0b\x0c\r '

Wie verwende ich dies mit einer Zeichenfolge, ohne '\ t |\n | ... etc für reguläre Ausdrücke manuell eingeben zu müssen?

Zum Beispiel sollte es sich drehen können: "Bitte\n verletze mich nicht\x0b."

in

"Bitte tu mir nicht weh."

Ich würde wahrscheinlich die einzelnen Leerzeichen behalten wollen, aber es wäre einfach genug, nur string.whitespace [: - 1] zu verwenden.

47
Alex

Für genau diesen Anwendungsfall gibt es eine spezielle Abkürzung!

Wenn Sie str.split Ohne Argument aufrufen, werden Leerzeichen anstelle einzelner Zeichen verwendet. So:

>>> ' '.join("Please \n don't \t hurt \x0b me.".split())
"Please don't hurt me."
144
bobince

Was ist los mit dem \s Zeichenklasse?

>>> import re

>>> pattern = re.compile(r'\s+')
>>> re.sub(pattern, ' ', "Please \n don't \t hurt \x0b me.")
"Please don't hurt me."
13
Imran

Nehmen wir einige vernünftige Annahmen an:

(1) Sie möchten wirklich jede Reihe von Leerzeichen durch ein einzelnes Leerzeichen ersetzen (eine Reihe hat eine Länge von 1 oder mehr).

(2) Sie möchten, dass derselbe Code mit minimalen Änderungen unter Python 2.X mit Unicode-Objekten funktioniert.

(3) Sie möchten nicht, dass Ihr Code Dinge übernimmt, die in den Dokumenten nicht garantiert sind

(4) Sie möchten, dass derselbe Code mit minimalen Änderungen an Python 3.X str-Objekten funktioniert.

Die aktuell ausgewählte Antwort weist folgende Probleme auf:

(a) ändert " " * 3 in " " * 2, d. h. es werden doppelte Leerzeichen entfernt, Leerzeichen jedoch nicht dreifach, vierfach usw. [nicht erfüllt Anforderung 1]

(b) ändert "foo\tbar\tzot" in "foobarzot"

(c) Wenn ein Unicode-Objekt eingegeben wird, erhält TypeError: translate() takes exactly one argument (2 given) [die Anforderung 2 nicht erfüllt]

(d) verwendet string.whitespace[:-1] [nicht erfüllt Anforderung 3; Reihenfolge der Zeichen in string.whitespace ist nicht garantiert]

(e) verwendet string.whitespace[:-1] [nicht erfüllt Anforderung 4; in Python 2.X ist string.whitespace '\t\n\x0b\x0c\r '; in Python 3.X ist es '\ t\n\r\x0b\x0c ']

Die Antwort " ".join(s.split()) und die Antwort re.sub(r"\s+", " ", s) haben diese Probleme nicht.

9
John Machin

Sie können die Übersetzungsmethode verwenden

import string

s = "Please \n don't \t hurt \x0b me."
s = s.translate(None, string.whitespace[:-1]) # python 2.6 and up
s = s.translate(string.maketrans('',''), string.whitespace[:-1]) # python 2.5, dunno further down
>>> s
"Please  don't  hurt  me."

Und dann doppelte Leerzeichen entfernen

s.replace('  ', ' ')
>>> s
"Please don't hurt me."
2
Tor Valamo

ein Ausgangspunkt .. (obwohl es nicht kürzer ist als das manuelle Zusammenstellen des Whitespace-Zirkus) ..

>>> from string import whitespace as ws
>>> import re

>>> p = re.compile('(%s)' % ('|'.join([c for c in ws])))
>>> s = "Please \n don't \t hurt \x0b me."

>>> p.sub('', s)
"Pleasedon'thurtme."

Oder wenn Sie das Leerzeichen auf maximal eins reduzieren möchten:

>>> p1 = re.compile('(%s)' % ('|'.join([c for c in ws if not c == ' '])))
>>> p2 = re.compile(' +')
>>> s = "Please \n don't \t hurt \x0b me."

>>> p2.sub(' ', p1.sub('', s))
"Please don't hurt me."

Drittens kompakter:

>>> import string

>>> s = "Please \n don't \t hurt \x0b me."
>>> s.translate(None, string.whitespace[])
"Pleasedon'thurtme."

>>> s.translate(None, string.whitespace[:5])
"Please  don't  hurt  me."

>>> ' '.join(s.translate(None, string.whitespace[:5]).split())
"Please don't hurt me."
1
miku