Entfernen Sie alle Zeilenumbrüche aus einer langen Textfolge

128

Grundsätzlich fordere ich den Benutzer auf, eine Textzeichenfolge in die Konsole einzugeben, aber die Zeichenfolge ist sehr lang und enthält viele Zeilenumbrüche. Wie würde ich die Zeichenfolge des Benutzers nehmen und alle Zeilenumbrüche löschen, um daraus eine einzelne Textzeile zu machen? Meine Methode zum Erfassen der Zeichenfolge ist sehr einfach.

string = raw_input("Please enter string: ")

Gibt es eine andere Möglichkeit, die Zeichenfolge vom Benutzer zu übernehmen? Ich verwende Python 2.7.4 auf einem Mac.

PS Natürlich bin ich ein Neuling. Selbst wenn eine Lösung nicht die effizienteste ist, wäre die Lösung mit der einfachsten Syntax sehr willkommen.

Ian Zane
quelle
4
@NicYoung, das ist ähnlich, aber anders. stripEntfernt Leerzeichen am Anfang und Ende einer Zeichenfolge, nicht innerhalb der Zeichenfolge ...
Daren Thomas

Antworten:

214

Wie geben Sie Zeilenumbrüche ein raw_input? Sobald Sie jedoch eine Zeichenfolge mit einigen Zeichen haben, möchten Sie diese entfernen, nur replacediese.

>>> mystr = raw_input('please enter string: ')
please enter string: hello world, how do i enter line breaks?
>>> # pressing enter didn't work...
...
>>> mystr
'hello world, how do i enter line breaks?'
>>> mystr.replace(' ', '')
'helloworld,howdoienterlinebreaks?'
>>>

Im obigen Beispiel habe ich alle Leerzeichen ersetzt. Die Zeichenfolge steht '\n'für Zeilenumbrüche. Und \rstellt Wagenrückläufe dar (wenn Sie unter Windows arbeiten, erhalten Sie diese möglicherweise und eine Sekunde replaceerledigt sie für Sie!).

Grundsätzlich:

# you probably want to use a space ' ' to replace `\n`
mystring = mystring.replace('\n', ' ').replace('\r', '')

Beachten Sie auch, dass es eine schlechte Idee ist, Ihre Variable aufzurufen string, da dies das Modul beschattet string. Ein anderer Name, den ich vermeiden würde, aber manchmal gerne verwenden würde : file. Aus dem gleichen Grunde.

Daren Thomas
quelle
Hat perfekt funktioniert, sorry für die blöde Frage! Meine anfängliche Lösung bestand darin, die Zeichenfolge aufzulisten und nach allen Instanzen von \ n zu suchen. Da die Liste jedoch nur 1 Zeichen pro Listeneintrag enthielt, gab die Suche immer wieder false zurück, da entweder \ oder n, aber nicht beide in derselben Liste gefunden wurden Eintrag.
Ian Zane
4
Diese Antwort ist für mich sehr hilfreich, da sie die \rWagenrückläufe erwähnt . Ich habe alle Methoden zum Entfernen ausprobiert, \naber die \rZeichen immer noch nicht erfasst .
Clay
1
Dies erledigt normalerweise die Arbeit für mich - string.replace ('\ r \ n', '')). Die meisten Protokoll- / Texteditordateien folgen bei neuen Zeilen diesem Format.
Quest Monger
1
Sie weisen darauf hin, dass Sie den Variablennamen nicht verwenden string, aber aus einem ähnlichen Grund möchten Sie den Variablennamen nicht verwenden str.
Tscizzle
2
@information_interchange Dieser Ansatz funktioniert mit Linux-Dateien, die dies \njedoch nicht getan haben \r\n.
Noumenon
45

Sie können versuchen, Zeichenfolge zu ersetzen:

string = string.replace('\r', '').replace('\n', '')
Konstantin Dinev
quelle
Ich hatte ein Problem mit einigen Texten. Ich habe versucht, rstrip () zu verwenden, aber es hat nicht funktioniert. Ich benutze replace ().
Bruno Gomes
25

Sie können die Zeichenfolge ohne Trennzeichen arg teilen, wodurch aufeinanderfolgende Leerzeichen als einzelnes Trennzeichen (einschließlich Zeilenumbrüche und Tabulatoren) behandelt werden. Dann verbinden Sie sich mit einem Leerzeichen:

In : " ".join("\n\nsome    text \r\n with multiple whitespace".split())
Out: 'some text with multiple whitespace'

https://docs.python.org/2/library/stdtypes.html#str.split

Sean
quelle
Sehr schöne Idee, weil normalisiere auch Tabulatoren, doppelte Leerzeichen und so weiter +1
daitangio
15

aktualisiert basierend auf XbelloKommentar:

string = my_string.rstrip('\r\n')

Lesen Sie hier mehr

tokhi
quelle
3
Ich bin gerade davon gebissen worden. Wenn Sie das zu rstripende \ n angeben, schlägt \ r fehl. Wenn Sie nichts angeben, werden Leerzeichen, \ t und möglicherweise andere abgeschnitten. Sie müssen verwendenrstrip("\r\n")
xbello
1
hatte eine Saite, wo einfach rstrip('\r\n')nicht genug war und musste mit gehen:my_string.rstrip('\r\n').replace('\n', ' ')
MMT
8

Eine weitere Option ist Regex:

>>> import re
>>> re.sub("\n|\r", "", "Foo\n\rbar\n\rbaz\n\r")
'Foobarbaz'
Neil
quelle
Weitere Informationen zum Abgleichen aufeinanderfolgender Zeilenumbrüche wären hilfreich r'[\n\r]+'oder würden sogar r'\s+'Leerzeichen durch ein einzelnes Leerzeichen ersetzen.
Risadinha
3

Eine Methode, die berücksichtigt

  • zusätzliche weiße Zeichen am Anfang / Ende der Zeichenfolge
  • zusätzliche weiße Zeichen am Anfang / Ende jeder Zeile
  • verschiedene Endzeilenzeichen

Es wird eine solche mehrzeilige Zeichenfolge benötigt, die z. B. unordentlich sein kann

test_str = '\nhej ho \n aaa\r\n   a\n '

und erzeugt eine schöne einzeilige Zeichenfolge

>>> ' '.join([line.strip() for line in test_str.strip().splitlines()])
'hej ho aaa a'

UPDATE: So beheben Sie mehrere Zeilenumbrüche, die redundante Leerzeichen erzeugen:

' '.join([line.strip() for line in test_str.strip().splitlines() if line.strip()])

Dies funktioniert auch für Folgendes test_str = '\nhej ho \n aaa\r\n\n\n\n\n a\n '

Kamil Neczaj
quelle
Dies behandelt nicht den Fall zusammenhängender Zeilenvorschübe in der Mitte des Strings. Zwei Zeilenvorschübe führen zu zwei zusammenhängenden Leerzeichen in der Ausgabe. Versuchen Sie "test_str = '\ nhej ho \ n aaa \ r \ n \ na \ n'"
Mike Gleen
2

Wenn sich jemand für die Verwendung entscheidet replace, sollten Sie es r'\n'stattdessen versuchen'\n'

mystring = mystring.replace(r'\n', ' ').replace(r'\r', '')
Anar Salimkhanov
quelle
Warum? Ich erinnere mich vage, warum dies eine gute Idee ist, aber wir müssen sie dokumentieren.
Martin Burch
1
In meinem Fall musste ich Folgendes tun: 1. HTML-Code aus DB abrufen 2. Erforderlichen Text aus HTML abrufen 3. Alle Zeilenumbrüche aus Text entfernen 4. Bearbeiteten Text in ein Tabellenkalkulationsdokument einfügen Und es funktionierte nicht richtig, es sei denn, ich verwendet r("Raw String Literal"). Leider habe ich keine Ahnung warum)
Anar Salimkhanov
1

Das Problem mit rstrip ist, dass es nicht in allen Fällen funktioniert (wie ich selbst nur wenige gesehen habe). Stattdessen können Sie - text = text.replace ("\ n", "") verwenden. Dadurch werden alle neuen Zeilen \ n mit einem Leerzeichen entfernt.

Vielen Dank im Voraus Jungs für Ihre Upvotes.

Ankit Dwivedi
quelle