Die Zeichen, die Python als Leerzeichen betrachtet, werden in gespeichert string.whitespace.
John Fouhy
2
Mit "Streifenfunktion" meinen Sie die Streifenmethode? "Es scheint nicht für meine Eingabe zu funktionieren." Bitte geben Sie Ihren Code, Ihre Eingabe und die Ausgabe an.
Dies wird jeden Raum Streifen, \t, \n, oder \rZeichen von der linken Seite, die rechte Seite, oder auf beiden Seiten des Strings.
In den obigen Beispielen werden nur Zeichenfolgen von der linken und rechten Seite der Zeichenfolgen entfernt. Wenn Sie auch Zeichen aus der Mitte einer Zeichenfolge entfernen möchten, versuchen Sie Folgendes re.sub:
Das letzte Beispiel ist genau wie mit str.replace(" ",""). Sie müssen nicht verwenden re, es sei denn, Sie haben mehr als ein Leerzeichen, dann funktioniert Ihr Beispiel nicht. []wurde entwickelt, um einzelne Zeichen zu markieren. Es ist nicht erforderlich, wenn Sie nur verwenden \s. Verwenden Sie entweder \s+oder [\s]+(nicht notwendig) , aber [\s+]die Arbeit nicht tun, insbesondere wenn man die mehrere Räume mit einem einzigen ersetzen will wie das Drehen "this example" in "this example".
Jorge E. Cardona
3
@ JorgeE.Cardona - Eine Sache, bei der Sie etwas falsch liegen - \swird Tabs enthalten, während dies replace(" ", "")nicht der Fall ist .
Leider wird dadurch auch der Innenraum entfernt, während das Beispiel in der ursprünglichen Frage die Innenräume unberührt lässt.
Brandon Rhodes
12
#how to trim a multi line string or a file
s=""" line one
\tline two\t
line three """#line1 starts with a space, #2 starts and ends with a tab, #3 ends with a space.
s1=s.splitlines()print s1
[' line one','\tline two\t','line three ']print[i.strip()for i in s1]['line one','line two','line three']#more details:#we could also have used a forloop from the begining:for line in s.splitlines():
line=line.strip()
process(line)#we could also be reading a file line by line.. e.g. my_file=open(filename), or with open(filename) as myfile:for line in my_file:
line=line.strip()
process(line)#moot point: note splitlines() removed the newline characters, we can keep them by passing True:#although split() will then remove them anyway..
s2=s.splitlines(True)print s2
[' line one\n','\tline two\t\n','line three ']
Nachdem ich mir hier einige Lösungen mit unterschiedlichem Verständnis angesehen hatte, fragte ich mich, was ich tun sollte, wenn die Zeichenfolge durch Kommas getrennt war ...
das Problem
Beim Versuch, eine CSV mit Kontaktinformationen zu verarbeiten, brauchte ich eine Lösung für dieses Problem: Trimmen Sie überflüssige Leerzeichen und etwas Junk, aber behalten Sie nachgestellte Kommas und interne Leerzeichen bei. Als ich mit einem Feld arbeitete, das Notizen zu den Kontakten enthielt, wollte ich den Müll entfernen und das gute Zeug zurücklassen. Nachdem ich alle Satzzeichen und Spreu entfernt hatte, wollte ich das Leerzeichen zwischen zusammengesetzten Token nicht verlieren, da ich es später nicht wieder aufbauen wollte.
Regex und Muster: [\s_]+?\W+
Das Muster sucht nach einzelnen Instanzen eines Leerzeichens und dem Unterstrich ('_') von 1 bis zu einer unbegrenzten Anzahl von Trägen (so wenig Zeichen wie möglich) [\s_]+?, bevor Nicht-Wort-Zeichen von 1 bis zu einer unbegrenzten Anzahl von Zeichen auftreten Zeit damit: \W+(entspricht [^a-zA-Z0-9_]). Insbesondere werden dabei Leerzeichen gefunden: Nullzeichen (\ 0), Tabulatoren (\ t), Zeilenumbrüche (\ n), Feed-Forward (\ f), Wagenrücklauf (\ r).
Ich sehe den Vorteil darin in zweierlei Hinsicht:
dass es keine Leerzeichen zwischen den vollständigen Wörtern / Token entfernt, die Sie möglicherweise zusammenhalten möchten;
Die in Python integrierte Zeichenfolgenmethode strip()behandelt nicht die Zeichenfolge, sondern nur das linke und das rechte Ende, und das Standardargument sind Nullzeichen (siehe Beispiel unten: Mehrere Zeilenumbrüche befinden sich im Text und strip()entfernen sie nicht alle, während das Regex-Muster dies tut). .text.strip(' \n\t\r')
Dies geht über die OP-Frage hinaus, aber ich denke, es gibt viele Fälle, in denen wir möglicherweise seltsame, pathologische Instanzen in den Textdaten haben, wie ich es getan habe (einige davon, wie die Escape-Zeichen in einem Teil des Textes gelandet sind). Darüber hinaus möchten wir in listähnlichen Zeichenfolgen das Trennzeichen nur entfernen, wenn das Trennzeichen zwei Leerzeichen oder ein Nicht-Wort-Zeichen wie '-,' oder '-, ,,,' trennt.
NB: Ich spreche nicht über das Trennzeichen der CSV selbst. Nur von Instanzen innerhalb der CSV, in denen die Daten listenartig sind, dh eine cs-Zeichenfolge von Teilzeichenfolgen.
Vollständige Offenlegung: Ich habe nur etwa einen Monat lang Text manipuliert und erst in den letzten zwei Wochen einen regulären Ausdruck vorgenommen. Ich bin mir also sicher, dass mir einige Nuancen fehlen. Für kleinere Sammlungen von Zeichenfolgen (meine befinden sich in einem Datenrahmen von 12.000 Zeilen und 40 ungeraden Spalten) funktioniert dies als letzter Schritt nach einem Durchgang zum Entfernen von Fremdzeichen besonders gut, insbesondere wenn Sie an Ihrer Stelle zusätzliche Leerzeichen einfügen Sie möchten Text trennen, der durch ein Nicht-Wort-Zeichen verbunden ist, aber keine Leerzeichen hinzufügen, in denen zuvor keine vorhanden waren.
Ein Beispiel:
import re
text ="\"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, , , , \r, , \0, ff dd \n invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s, \n i69rpofhfsp9t7c practice 20ignition - 20june \t\n .2134.pdf 2109 \n\n\n\nklkjsdf\""print(f"Here is the text as formatted:\n{text}\n")print()print("Trimming both the whitespaces and the non-word characters that follow them.")print()
trim_ws_punctn = re.compile(r'[\s_]+?\W+')
clean_text = trim_ws_punctn.sub(' ', text)print(clean_text)print()print("what about 'strip()'?")print(f"Here is the text, formatted as is:\n{text}\n")
clean_text = text.strip(' \n\t\r')# strip out whitespace?print()print(f"Here is the text, formatted as is:\n{clean_text}\n")print()print("Are 'text' and 'clean_text' unchanged?")print(clean_text == text)
Dies gibt aus:
Hereis the text as formatted:"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"
using regex to trim both the whitespaces and the non-word characters that follow them."portfolio, derp, hello-world, hello-, world, founders, mentors, ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, ff, series a, exit, general mailing, fr, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, [email protected], dd invites,subscribed,, master, dd invites,subscribed, ff dd invites, subscribed, alumni spring 2012 deck: https: www.dropbox.com s, i69rpofhfsp9t7c practice 20ignition 20june 2134.pdf 2109 klkjsdf"Very nice.What about 'strip()'?Hereis the text, formatted asis:"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"Hereis the text, after stipping with'strip':"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"Are'text'and'clean_text' unchanged?'True'
Der Streifen entfernt also jeweils ein Leerzeichen. Also im Fall der OP strip()ist das in Ordnung. Wenn die Dinge jedoch komplexer werden, können Regex und ein ähnliches Muster für allgemeinere Einstellungen von Wert sein.
Wenn Sie das Leerzeichen nur am Anfang und am Ende der Zeichenfolge abschneiden möchten, können Sie Folgendes tun:
some_string =" Hello, world!\n "
new_string = some_string.strip()# new_string is now "Hello, world!"
Dies funktioniert ähnlich wie die QString :: trimmed () -Methode von Qt, da führende und nachfolgende Leerzeichen entfernt werden, während interne Leerzeichen in Ruhe gelassen werden.
Wenn Sie jedoch die QString :: simplified () -Methode von Qt möchten, mit der nicht nur führende und nachfolgende Leerzeichen entfernt, sondern auch alle aufeinanderfolgenden internen Leerzeichen in ein Leerzeichen "zerquetscht" werden, können Sie eine Kombination aus .split()und " ".joinwie folgt verwenden :
some_string ="\t Hello, \n\t world!\n "
new_string =" ".join(some_string.split())# new_string is now "Hello, world!"
In diesem letzten Beispiel wurde jede Sequenz von internen Leerzeichen durch ein einzelnes Leerzeichen ersetzt, während das Leerzeichen weiterhin vom Anfang und Ende der Zeichenfolge abgeschnitten wurde.
>>> myStr ="Hi\n Stack Over \r flow!">>> charList =[u"\u005Cn",u"\u005Cr",u"\u005Ct"]>>>import re
>>>for i in charList:
myStr = re.sub(i, r"", myStr)>>> myStr
'Hi Stack Over flow'
Hinweis: Dies dient nur zum Entfernen von "\ n", "\ r" und "\ t". Es werden keine zusätzlichen Leerzeichen entfernt.
Warum einen regulären Ausdruck verwenden, wenn s.strip()genau dies geschieht?
Ned Batchelder
1
s.strip()behandelt nur den anfänglichen Leerraum, nicht jedoch Leerzeichen, die nach dem Entfernen anderer unerwünschter Zeichen "entdeckt" wurden. Beachten Sie, dass dies sogar das Leerzeichen nach der endgültigen Führung entfernt\n
Rafe
Jemand hat diese Antwort abgelehnt, aber nicht erklärt, warum sie fehlerhaft ist. Schande über dich (@NedBatchelder, wenn die Abstimmung nicht war, bitte rückgängig machen, da ich deine Frage erklärt habe und du nichts erwähnt hast, was mit meiner Antwort tatsächlich gebrochen ist)
Rafe
10
Rafe, vielleicht möchten Sie es noch einmal überprüfen: s.strip()Erzeugt genau das gleiche Ergebnis wie Ihre Regex.
Ned Batchelder
3
@Safe, Sie verwechseln es mit Trimmen. Strip führt die erforderlichen Operationen aus.
string.whitespace
.Antworten:
Leerzeichen auf beiden Seiten:
Leerzeichen auf der rechten Seite:
Leerzeichen auf der linken Seite:
Wie thedz hervorhebt , können Sie ein Argument angeben , um beliebige Zeichen für eine dieser Funktionen wie folgt zu entfernen :
Dies wird jeden Raum Streifen,
\t
,\n
, oder\r
Zeichen von der linken Seite, die rechte Seite, oder auf beiden Seiten des Strings.In den obigen Beispielen werden nur Zeichenfolgen von der linken und rechten Seite der Zeichenfolgen entfernt. Wenn Sie auch Zeichen aus der Mitte einer Zeichenfolge entfernen möchten, versuchen Sie Folgendes
re.sub
:Das sollte ausdrucken:
quelle
str.replace(" ","")
. Sie müssen nicht verwendenre
, es sei denn, Sie haben mehr als ein Leerzeichen, dann funktioniert Ihr Beispiel nicht.[]
wurde entwickelt, um einzelne Zeichen zu markieren. Es ist nicht erforderlich, wenn Sie nur verwenden\s
. Verwenden Sie entweder\s+
oder[\s]+
(nicht notwendig) , aber[\s+]
die Arbeit nicht tun, insbesondere wenn man die mehrere Räume mit einem einzigen ersetzen will wie das Drehen"this example"
in"this example"
.\s
wird Tabs enthalten, während diesreplace(" ", "")
nicht der Fall ist .Die Python-
trim
Methode heißtstrip
:quelle
Für führende und nachfolgende Leerzeichen:
Andernfalls funktioniert ein regulärer Ausdruck:
quelle
pat = re.compile(r'\s+')
sub(" ", s)
nicht""
die später die Worte verschmelzen und Sie werden nicht mehr nutzen können.split(" ")
tokenize.print
Aussagen zu sehenSie können auch eine sehr einfache und grundlegende Funktion verwenden: str.replace () , arbeitet mit den Leerzeichen und Tabulatoren:
Simpel und einfach.
quelle
quelle
Bisher hat noch niemand diese Regex-Lösungen veröffentlicht.
Matching:
Suchen (Sie müssen den Eingabefall "Nur Leerzeichen" unterschiedlich behandeln):
Wenn Sie verwenden
re.sub
, können Sie innere Leerzeichen entfernen, was unerwünscht sein kann.quelle
Whitespace enthält Leerzeichen, Tabulatoren und CRLF . Eine elegante und einzeilige String-Funktion, die wir verwenden können, ist also übersetzen .
' hello apple'.translate(None, ' \n\t\r')
ODER wenn Sie gründlich sein wollen
quelle
Dadurch werden alle unerwünschten Leerzeichen und Zeilenumbrüche entfernt. Ich hoffe das hilft
Dies führt zu:
'a b \ nc' wird in 'ab c' geändert
quelle
Ausgabe:
Hinzufügen des Kommentars von Le Droid zur Antwort. Mit einem Leerzeichen trennen:
Ausgabe:
quelle
Wenn Sie Python 3 verwenden: Beenden Sie in Ihrer print-Anweisung mit sep = "". Das wird alle Räume trennen.
BEISPIEL:
Dies wird drucken: Ich liebe Kartoffeln.
Anstelle von: Ich liebe Kartoffeln.
In Ihrem Fall tun Sie sep = "\ t", da Sie versuchen würden, die \ t zu fahren.
quelle
Nachdem ich mir hier einige Lösungen mit unterschiedlichem Verständnis angesehen hatte, fragte ich mich, was ich tun sollte, wenn die Zeichenfolge durch Kommas getrennt war ...
das Problem
Beim Versuch, eine CSV mit Kontaktinformationen zu verarbeiten, brauchte ich eine Lösung für dieses Problem: Trimmen Sie überflüssige Leerzeichen und etwas Junk, aber behalten Sie nachgestellte Kommas und interne Leerzeichen bei. Als ich mit einem Feld arbeitete, das Notizen zu den Kontakten enthielt, wollte ich den Müll entfernen und das gute Zeug zurücklassen. Nachdem ich alle Satzzeichen und Spreu entfernt hatte, wollte ich das Leerzeichen zwischen zusammengesetzten Token nicht verlieren, da ich es später nicht wieder aufbauen wollte.
Regex und Muster:
[\s_]+?\W+
Das Muster sucht nach einzelnen Instanzen eines Leerzeichens und dem Unterstrich ('_') von 1 bis zu einer unbegrenzten Anzahl von Trägen (so wenig Zeichen wie möglich)
[\s_]+?
, bevor Nicht-Wort-Zeichen von 1 bis zu einer unbegrenzten Anzahl von Zeichen auftreten Zeit damit:\W+
(entspricht[^a-zA-Z0-9_]
). Insbesondere werden dabei Leerzeichen gefunden: Nullzeichen (\ 0), Tabulatoren (\ t), Zeilenumbrüche (\ n), Feed-Forward (\ f), Wagenrücklauf (\ r).Ich sehe den Vorteil darin in zweierlei Hinsicht:
dass es keine Leerzeichen zwischen den vollständigen Wörtern / Token entfernt, die Sie möglicherweise zusammenhalten möchten;
Die in Python integrierte Zeichenfolgenmethode
strip()
behandelt nicht die Zeichenfolge, sondern nur das linke und das rechte Ende, und das Standardargument sind Nullzeichen (siehe Beispiel unten: Mehrere Zeilenumbrüche befinden sich im Text undstrip()
entfernen sie nicht alle, während das Regex-Muster dies tut). .text.strip(' \n\t\r')
Dies geht über die OP-Frage hinaus, aber ich denke, es gibt viele Fälle, in denen wir möglicherweise seltsame, pathologische Instanzen in den Textdaten haben, wie ich es getan habe (einige davon, wie die Escape-Zeichen in einem Teil des Textes gelandet sind). Darüber hinaus möchten wir in listähnlichen Zeichenfolgen das Trennzeichen nur entfernen, wenn das Trennzeichen zwei Leerzeichen oder ein Nicht-Wort-Zeichen wie '-,' oder '-, ,,,' trennt.
NB: Ich spreche nicht über das Trennzeichen der CSV selbst. Nur von Instanzen innerhalb der CSV, in denen die Daten listenartig sind, dh eine cs-Zeichenfolge von Teilzeichenfolgen.
Vollständige Offenlegung: Ich habe nur etwa einen Monat lang Text manipuliert und erst in den letzten zwei Wochen einen regulären Ausdruck vorgenommen. Ich bin mir also sicher, dass mir einige Nuancen fehlen. Für kleinere Sammlungen von Zeichenfolgen (meine befinden sich in einem Datenrahmen von 12.000 Zeilen und 40 ungeraden Spalten) funktioniert dies als letzter Schritt nach einem Durchgang zum Entfernen von Fremdzeichen besonders gut, insbesondere wenn Sie an Ihrer Stelle zusätzliche Leerzeichen einfügen Sie möchten Text trennen, der durch ein Nicht-Wort-Zeichen verbunden ist, aber keine Leerzeichen hinzufügen, in denen zuvor keine vorhanden waren.
Ein Beispiel:
Dies gibt aus:
Der Streifen entfernt also jeweils ein Leerzeichen. Also im Fall der OP
strip()
ist das in Ordnung. Wenn die Dinge jedoch komplexer werden, können Regex und ein ähnliches Muster für allgemeinere Einstellungen von Wert sein.sehen Sie es in Aktion
quelle
versuche zu übersetzen
quelle
Wenn Sie das Leerzeichen nur am Anfang und am Ende der Zeichenfolge abschneiden möchten, können Sie Folgendes tun:
Dies funktioniert ähnlich wie die QString :: trimmed () -Methode von Qt, da führende und nachfolgende Leerzeichen entfernt werden, während interne Leerzeichen in Ruhe gelassen werden.
Wenn Sie jedoch die QString :: simplified () -Methode von Qt möchten, mit der nicht nur führende und nachfolgende Leerzeichen entfernt, sondern auch alle aufeinanderfolgenden internen Leerzeichen in ein Leerzeichen "zerquetscht" werden, können Sie eine Kombination aus
.split()
und" ".join
wie folgt verwenden :In diesem letzten Beispiel wurde jede Sequenz von internen Leerzeichen durch ein einzelnes Leerzeichen ersetzt, während das Leerzeichen weiterhin vom Anfang und Ende der Zeichenfolge abgeschnitten wurde.
quelle
Im Allgemeinen verwende ich die folgende Methode:
Hinweis: Dies dient nur zum Entfernen von "\ n", "\ r" und "\ t". Es werden keine zusätzlichen Leerzeichen entfernt.
quelle
zum Entfernen von Leerzeichen aus der Mitte der Zeichenfolge
Ausgabe:
quelle
Dadurch werden alle Leerzeichen und Zeilenumbrüche am Anfang und am Ende einer Zeichenfolge entfernt:
quelle
s.strip()
genau dies geschieht?s.strip()
behandelt nur den anfänglichen Leerraum, nicht jedoch Leerzeichen, die nach dem Entfernen anderer unerwünschter Zeichen "entdeckt" wurden. Beachten Sie, dass dies sogar das Leerzeichen nach der endgültigen Führung entfernt\n
s.strip()
Erzeugt genau das gleiche Ergebnis wie Ihre Regex.