2046 Stimmen

Wie entferne ich einen nachgestellten Zeilenumbruch?

Wie entferne ich das letzte Zeichen einer Zeichenkette, wenn es ein Zeilenumbruch ist?

"abc\n"  -->  "abc"

4 Stimmen

Superset: beliebige Zeichenkette anstelle von nur newline: stackoverflow.com/questions/1038824/

9 Stimmen

Die A+-Antwort lautet, wenn dies darauf zurückzuführen ist, dass vergessen wurde open() eine Datei mit dem entsprechenden 'newline=...' Parameter für Ihre Plattform (universelle Unterstützung von Zeilenumbrüchen), müssen Sie ihn möglicherweise nicht explizit entfernen.

8voto

s = '''Hello  World \t\n\r\tHi There'''
# import the module string   
import string
# use the method translate to convert 
s.translate({ord(c): None for c in string.whitespace}
>>'HelloWorldHiThere'

Mit regex

s = '''  Hello  World 
\t\n\r\tHi '''
print(re.sub(r"\s+", "", s), sep='')  # \s matches all white spaces
>HelloWorldHi

Ersetzen Sie \n , \t , \r

s.replace('\n', '').replace('\t','').replace('\r','')
>'  Hello  World Hi '

Mit regex

s = '''Hello  World \t\n\r\tHi There'''
regex = re.compile(r'[\n\r\t]')
regex.sub("", s)
>'Hello  World Hi There'

mit Join

s = '''Hello  World \t\n\r\tHi There'''
' '.join(s.split())
>'Hello  World Hi There'

5voto

>>> '   spacious   '.rstrip()
'   spacious'
>>> "AABAA".rstrip("A")
  'AAB'
>>> "ABBA".rstrip("AB") # both AB and BA are stripped
   ''
>>> "ABCABBA".rstrip("AB")
   'ABC'

0 Stimmen

Das Beispiel, das ich brauchte! Also rstrip(" \r\n ") wird sowohl ' \n ' und ' \r ' in beliebiger Kombination am Ende der Zeile!

0 Stimmen

@Agostino Kein Bedarf für die Bereitstellung "\r\n" Zum Beispiel: ' spacious \n\r\n\r \n\n'.rstrip() produziert ' spacious'

2 Stimmen

@olibre der Code, den Sie vorschlagen, wird auch andere Leerzeichen entfernen, was vielleicht nicht das ist, was man braucht. Tatsächlich musste ich nur Kombinationen von eol-Zeichen entfernen. Trotzdem danke für den Hinweis.

4voto

Help me Punkte 51

Verwenden Sie einfach :

line = line.rstrip("\n")

oder

line = line.strip("\n")

Sie brauchen nichts von diesem komplizierten Zeug

3 Stimmen

Beachten Sie, dass dies nicht dasselbe ist wie chomp.

3voto

internetional Punkte 312

Es gibt drei Arten von Zeilenenden, denen wir normalerweise begegnen: \n , \r et \r\n . Ein recht einfacher regulärer Ausdruck in re.sub und zwar r"\r?\n?$" kann sie alle fangen.

(Und wir man muss sie alle fangen habe ich recht?)

import re

re.sub(r"\r?\n?$", "", the_text, 1)

Mit dem letzten Argument beschränken wir die Anzahl der ersetzten Vorkommen auf eins und ahmen damit in gewisser Weise chomp nach. Beispiel:

import re

text_1 = "hellothere\n\n\n"
text_2 = "hellothere\n\n\r"
text_3 = "hellothere\n\n\r\n"

a = re.sub(r"\r?\n?$", "", text_1, 1)
b = re.sub(r"\r?\n?$", "", text_2, 1)
c = re.sub(r"\r?\n?$", "", text_3, 1)

... wo a == b == c es True .

0 Stimmen

Sie brauchen nicht einmal vollwertige reguläre Ausdrücke. rstrip("\r\n") ist ein Auffangtatbestand. Versuchen Sie print(text_2.rstrip('\r\n')) .

0 Stimmen

@Agostino : Richtig, wenn man bedenkt, dass str.rstrip() löst das Problem. Es kommt darauf an, welche Bedürfnisse Sie haben. Diese Lösung ist speziell für die Fälle gedacht, in denen Sie nur den letzten "\n" , "\r" o "\r\n" aber nicht alle (wenn es mehrere davon gibt "\n" in der Zeichenkette). re.sub(r"\r?\n?$", "", text_1, 1) gibt zurück. "hellothere\n\n" y text_1.rstrip("\r\n") gibt zurück. "hellothere" was eine andere Zeichenfolge ist.

0 Stimmen

Was ich damit sagen will, ist, dass str.strip() ist ein Aufhänger, der manchmal genau das Problem ist.

1voto

Stephen Miller Punkte 412

Wenn es Ihnen um Geschwindigkeit geht (z.B. bei einer langen Liste von Strings) und Sie die Natur des Newline-Zeichens kennen, ist String Slicing tatsächlich schneller als rstrip. Ein kleiner Test, um dies zu veranschaulichen:

import time

loops = 50000000

def method1(loops=loops):
    test_string = 'num\n'
    t0 = time.time()
    for num in xrange(loops):
        out_sting = test_string[:-1]
    t1 = time.time()
    print('Method 1: ' + str(t1 - t0))

def method2(loops=loops):
    test_string = 'num\n'
    t0 = time.time()
    for num in xrange(loops):
        out_sting = test_string.rstrip()
    t1 = time.time()
    print('Method 2: ' + str(t1 - t0))

method1()
method2()

Ausgabe:

Method 1: 3.92700004578
Method 2: 6.73000001907

0 Stimmen

Ich weiß, ich sollte wahrscheinlich "globale Schleifen" innerhalb der Funktionen verwenden, aber das funktioniert auch.

0 Stimmen

Dieser Test ist falsch und nicht fair Unter method1 Sie schneiden einfach das letzte Zeichen ab, egal was, in method2 die .rstrip() prüft zunächst, ob das Ende der Zeichenkette unerwünschte Zeichen enthält und schneidet diese nur ab, wenn welche gefunden wurden. Bitte implementieren Sie eine Prüfung auf Zeichen in method1 und noch einmal testen!

0 Stimmen

Wie ich in der Einleitung zu meiner Antwort sagte: Wenn Sie die Art des Zeilenumbruchs kennen, dann ist dies nützlich. Wenn nicht, dann müssen Sie natürlich eine Art von Zeichenprüfung implementieren - oder einfach rstrip verwenden. Ich wollte nicht "unfair" gegenüber rstrip sein, sondern nur einen nicht unbedeutenden Unterschied aufzeigen, der in manchen Situationen eine Überlegung wert sein kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X