Wie entferne ich das letzte Zeichen einer Zeichenkette, wenn es ein Zeilenumbruch ist?
"abc\n" --> "abc"
Wie entferne ich das letzte Zeichen einer Zeichenkette, wenn es ein Zeilenumbruch ist?
"abc\n" --> "abc"
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'
Das Beispiel, das ich brauchte! Also rstrip(" \r\n ") wird sowohl ' \n ' und ' \r ' in beliebiger Kombination am Ende der Zeile!
@Agostino Kein Bedarf für die Bereitstellung "\r\n"
Zum Beispiel: ' spacious \n\r\n\r \n\n'.rstrip()
produziert ' spacious'
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
.
Sie brauchen nicht einmal vollwertige reguläre Ausdrücke. rstrip("\r\n")
ist ein Auffangtatbestand. Versuchen Sie print(text_2.rstrip('\r\n'))
.
@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.
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
Ich weiß, ich sollte wahrscheinlich "globale Schleifen" innerhalb der Funktionen verwenden, aber das funktioniert auch.
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!
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 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.
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.