Strip entfernt die Zeichen, die an beiden Enden der Zeichenfolge angegeben sind. In Ihrem Fall werden ".", "c", "o" und "m" entfernt.
Truppo
6
Außerdem werden diese Zeichen von der Vorderseite der Zeichenfolge entfernt. Wenn Sie nur möchten, dass es vom Ende entfernt wird, verwenden Sie rstrip ()
Andre Miller
42
Ja. str.strip macht nicht das, was du denkst. str.strip entfernt alle angegebenen Zeichen am Anfang und am Ende der Zeichenfolge. "Acbacda" .strip ("ad") ergibt also "cbac"; Das a am Anfang und das da am Ende wurden entfernt. Prost.
Scvalex
2
Außerdem werden die Zeichen in beliebiger Reihenfolge entfernt : "site.ocm"> "site".
Eric O Lebigot
1
@scvalex, wow, habe gerade gemerkt, dass dies schon seit Ewigkeiten so verwendet wird - es ist gefährlich, weil der Code sowieso oft funktioniert
Flash
Antworten:
556
strip bedeutet nicht "diesen Teilstring entfernen". x.strip(y)behandelt yals Zeichensatz und entfernt alle Zeichen in diesem Satz von den Enden von x.
Stattdessen könnten Sie verwenden endswith und schneiden:
Ja, ich selbst denke, dass das erste Beispiel mit dem Test endwith () das bessere wäre. Die Regex-Version würde einige Leistungseinbußen nach sich ziehen (Analyse der Regex-Datei usw.). Ich würde nicht mit rsplit () arbeiten, aber das liegt daran, dass ich nicht weiß, was Sie genau erreichen wollen. Ich denke, es entfernt das .com genau dann, wenn es am Ende der URL erscheint? Die rsplit-Lösung würde Ihnen Probleme bereiten, wenn Sie sie für Domain-Namen wie 'www.commercialthingie.co.uk'
Steef
13
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
Burhan Khalid
1
Was ist, wenn ich EXAMLPLE.COMDomain-Namen schreibe , bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird? (Dies ist eine Abstimmung für die Regex-Lösung)
Jasen
3
Es ist kein Umschreiben, die rsplit()Lösung hat nicht das gleiche Verhalten wie die endswith(), wenn die ursprüngliche Zeichenfolge nicht den Teilstring am Ende hat, sondern irgendwo in der Mitte. Zum Beispiel: "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"aber"www.comeandsee.net".rsplit(".com",1)[0] == "www"
Steef
1
Die Syntax s[:-n]hat eine Einschränkung: Denn n = 0dies gibt nicht die Zeichenfolge mit den letzten abgeschnittenen Nullzeichen zurück, sondern die leere Zeichenfolge.
BlenderBender
90
Wenn Sie sicher sind, dass die Zeichenfolge nur am Ende angezeigt wird, ist es am einfachsten, 'replace' zu verwenden:
das wird auch url wie ersetzen www.computerhope.com. mach einen Check mit endswith()und sollte in Ordnung sein.
Ghostdog74
72
"www.computerhope.com".endswith(".com")ist wahr, es wird immer noch brechen!
1
"Wenn Sie sicher sind, dass die Zeichenfolge nur am Ende angezeigt wird", meinen Sie "Wenn Sie sicher sind, dass die Teilzeichenfolge nur einmal angezeigt wird"? Ersetzen scheint auch zu funktionieren, wenn sich der Teilstring in der Mitte befindet, aber wie der andere Kommentar andeutet, wird er jedes Auftreten des Teilstrings ersetzen, warum es am Ende sein sollte, verstehe ich nicht
idclev 463035818
49
def strip_end(text, suffix):ifnot text.endswith(suffix):return text
return text[:len(text)-len(suffix)]
Dies sollte effizienter sein als die verwendeten Methoden, split()da kein neues Listenobjekt erstellt wird. Diese Lösung funktioniert für Zeichenfolgen mit mehreren Punkten.
Wow das ist ein schöner Trick. Ich konnte dies nicht zum Scheitern bringen, aber es fiel mir auch schwer, mir Möglichkeiten auszudenken, wie dies fehlschlagen könnte. Ich mag es, aber es ist sehr "magisch", schwer zu wissen, was dies bewirkt, wenn man es nur ansieht. Ich musste jeden Teil der Linie mental verarbeiten, um "es zu bekommen".
DevPlayer
14
Dies schlägt fehl, wenn die gesuchte Zeichenfolge NICHT vorhanden ist und stattdessen fälschlicherweise das letzte Zeichen entfernt wird.
Robbat2
25
Hängt davon ab, was Sie über Ihre URL wissen und was Sie genau versuchen. Wenn Sie wissen, dass es immer mit '.com' (oder '.net' oder '.org') endet, dann
url=url[:-4]
ist die schnellste Lösung. Wenn es sich um allgemeinere URLs handelt, ist es wahrscheinlich besser, in die mit Python gelieferte URL-Bibliothek zu schauen.
Wenn Sie andererseits einfach alles nach dem letzten '.' Entfernen möchten. in einer Zeichenfolge dann
url.rsplit('.',1)[0]
wird funktionieren. Oder wenn Sie wollen, wollen Sie einfach alles bis zum ersten '.' dann versuche es
Wenn Sie ein Ende eines Strings entfernen müssen, falls vorhanden, tun Sie nichts. Meine besten Lösungen. Sie werden wahrscheinlich eine der ersten beiden Implementierungen verwenden wollen, der Vollständigkeit halber habe ich jedoch die dritte aufgenommen.
Für ein konstantes Suffix:
def remove_suffix(v, s):return v[:-len(s)if v.endswith(s)else v
remove_suffix("abc.com",".com")=='abc'
remove_suffix("abc",".com")=='abc'
Für eine Sammlung konstanter Suffixe der asymptotisch schnellste Weg für eine große Anzahl von Anrufen:
def remove_suffix_preprocess(*suffixes):
suffixes = set(suffixes)try:
suffixes.remove('')exceptKeyError:passdef helper(suffixes, pos):if len(suffixes)==1:
suf = suffixes[0]
l =-len(suf)
ls = slice(0, l)returnlambda v: v[ls]if v.endswith(suf)else v
si = iter(suffixes)
ml = len(next(si))
exact =Falsefor suf in si:
l = len(suf)if-l == pos:
exact =Trueelse:
ml = min(len(suf), ml)
ml =-ml
suffix_dict ={}for suf in suffixes:
sub = suf[ml:pos]if sub in suffix_dict:
suffix_dict[sub].append(suf)else:
suffix_dict[sub]=[suf]if exact:del suffix_dict['']for key in suffix_dict:
suffix_dict[key]= helper([s[:pos]for s in suffix_dict[key]],None)returnlambda v: suffix_dict.get(v[ml:pos],lambda v: v)(v[:pos])else:for key in suffix_dict:
suffix_dict[key]= helper(suffix_dict[key], ml)returnlambda v: suffix_dict.get(v[ml:pos],lambda v: v)(v)return helper(tuple(suffixes),None)
domain_remove = remove_suffix_preprocess(".com",".net",".edu",".uk",'.tv','.co.uk','.org.uk')
Der letzte ist bei Pypy wahrscheinlich deutlich schneller als bei Cpython. Die Regex-Variante ist wahrscheinlich in praktisch allen Fällen schneller, in denen keine großen Wörterbücher mit potenziellen Suffixen enthalten sind, die zumindest in cPython nicht einfach als Regex dargestellt werden können.
In PyPy ist die Regex-Variante für eine große Anzahl von Aufrufen oder langen Zeichenfolgen mit ziemlicher Sicherheit langsamer, selbst wenn das Re-Modul eine DFA-kompilierende Regex-Engine verwendet, da der überwiegende Teil des Overheads der Lambdas von der JIT optimiert wird.
In cPython jedoch vergleicht die Tatsache, dass Ihr laufender c-Code für den regulären Ausdruck mit ziemlicher Sicherheit die algorithmischen Vorteile der Suffix-Auflistungsversion in fast allen Fällen.
Es funktioniert mit jeder Erweiterung, wobei potenzielle andere Punkte auch im Dateinamen vorhanden sind. Es teilt die Zeichenfolge einfach als Liste auf Punkte und verbindet sie ohne das letzte Element.
Wenn jedoch die CPU der Flaschenhals ist, warum in Python schreiben?
Wann ist CPU überhaupt ein Flaschenhals? Vielleicht bei Fahrern.
Die Vorteile der Verwendung von regulären Ausdrücken liegen in der Wiederverwendbarkeit von Code. Was ist, wenn Sie als nächstes '.me' entfernen möchten, das nur drei Zeichen enthält?
In meinem Fall musste ich eine Ausnahme auslösen, also tat ich Folgendes:
classUnableToStripEnd(Exception):"""A Exception type to indicate that the suffix cannot be removed from the text."""@staticmethoddef get_exception(text, suffix):returnUnableToStripEnd("Could not find suffix ({0}) on text: {1}.".format(suffix, text))def strip_end(text, suffix):"""Removes the end of a string. Otherwise fails."""ifnot text.endswith(suffix):raiseUnableToStripEnd.get_exception(text, suffix)return text[:len(text)-len(suffix)]
Angenommen, Sie möchten die Domain entfernen, unabhängig davon, um was es sich handelt (.com, .net usw.). Ich empfehle, das zu finden .und alles von diesem Punkt an zu entfernen.
Dies ist jedoch nicht der Punkt der Frage. Es wurde nur gebeten, einen bekannten Teilstring vom Ende eines anderen zu entfernen. Dies funktioniert genau wie erwartet.
Ihre Antwort für Python 3.9 ist ein Duplikat dieser Antwort oben. Ihre Antwort für frühere Versionen wurde auch in diesem Thread oft beantwortet und würde nichts zurückgeben, wenn die Zeichenfolge nicht das Suffix hat.
Antworten:
strip
bedeutet nicht "diesen Teilstring entfernen".x.strip(y)
behandelty
als Zeichensatz und entfernt alle Zeichen in diesem Satz von den Enden vonx
.Stattdessen könnten Sie verwenden
endswith
und schneiden:Oder mit regulären Ausdrücken :
quelle
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
EXAMLPLE.COM
Domain-Namen schreibe , bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird? (Dies ist eine Abstimmung für die Regex-Lösung)rsplit()
Lösung hat nicht das gleiche Verhalten wie dieendswith()
, wenn die ursprüngliche Zeichenfolge nicht den Teilstring am Ende hat, sondern irgendwo in der Mitte. Zum Beispiel:"www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"
aber"www.comeandsee.net".rsplit(".com",1)[0] == "www"
s[:-n]
hat eine Einschränkung: Dennn = 0
dies gibt nicht die Zeichenfolge mit den letzten abgeschnittenen Nullzeichen zurück, sondern die leere Zeichenfolge.Wenn Sie sicher sind, dass die Zeichenfolge nur am Ende angezeigt wird, ist es am einfachsten, 'replace' zu verwenden:
quelle
www.computerhope.com
. mach einen Check mitendswith()
und sollte in Ordnung sein."www.computerhope.com".endswith(".com")
ist wahr, es wird immer noch brechen!quelle
return text[:-len(suffix)]
Da es so aussieht, als hätte noch niemand darauf hingewiesen:
Dies sollte effizienter sein als die verwendeten Methoden,
split()
da kein neues Listenobjekt erstellt wird. Diese Lösung funktioniert für Zeichenfolgen mit mehreren Punkten.quelle
Hängt davon ab, was Sie über Ihre URL wissen und was Sie genau versuchen. Wenn Sie wissen, dass es immer mit '.com' (oder '.net' oder '.org') endet, dann
ist die schnellste Lösung. Wenn es sich um allgemeinere URLs handelt, ist es wahrscheinlich besser, in die mit Python gelieferte URL-Bibliothek zu schauen.
Wenn Sie andererseits einfach alles nach dem letzten '.' Entfernen möchten. in einer Zeichenfolge dann
wird funktionieren. Oder wenn Sie wollen, wollen Sie einfach alles bis zum ersten '.' dann versuche es
quelle
Wenn Sie wissen, dass es sich um eine Erweiterung handelt, dann
Dies funktioniert genauso gut mit
abcdc.com
oderwww.abcdc.com
oderabcdc.[anything]
und ist erweiterbarer.quelle
In einer Zeile:
quelle
Wie wäre es mit
url[:-4]
?quelle
Für URLs (da es im angegebenen Beispiel ein Teil des Themas zu sein scheint) kann man Folgendes tun:
Beide geben Folgendes aus:
('http://www.stackoverflow', '.com')
Dies kann auch kombiniert werden,
str.endswith(suffix)
wenn Sie nur ".com" oder etwas Bestimmtes teilen müssen.quelle
ist nicht ganz richtig.
Was Sie tatsächlich schreiben müssten, ist
und es sieht meiner Meinung nach ziemlich prägnant aus.
Meine persönliche Präferenz ist jedoch diese Option, da nur ein Parameter verwendet wird:
quelle
Ab
Python 3.9
können Sieremovesuffix
stattdessen Folgendes verwenden:quelle
Wenn Sie ein Ende eines Strings entfernen müssen, falls vorhanden, tun Sie nichts. Meine besten Lösungen. Sie werden wahrscheinlich eine der ersten beiden Implementierungen verwenden wollen, der Vollständigkeit halber habe ich jedoch die dritte aufgenommen.
Für ein konstantes Suffix:
Für eine Regex:
Für eine Sammlung konstanter Suffixe der asymptotisch schnellste Weg für eine große Anzahl von Anrufen:
Der letzte ist bei Pypy wahrscheinlich deutlich schneller als bei Cpython. Die Regex-Variante ist wahrscheinlich in praktisch allen Fällen schneller, in denen keine großen Wörterbücher mit potenziellen Suffixen enthalten sind, die zumindest in cPython nicht einfach als Regex dargestellt werden können.
In PyPy ist die Regex-Variante für eine große Anzahl von Aufrufen oder langen Zeichenfolgen mit ziemlicher Sicherheit langsamer, selbst wenn das Re-Modul eine DFA-kompilierende Regex-Engine verwendet, da der überwiegende Teil des Overheads der Lambdas von der JIT optimiert wird.
In cPython jedoch vergleicht die Tatsache, dass Ihr laufender c-Code für den regulären Ausdruck mit ziemlicher Sicherheit die algorithmischen Vorteile der Suffix-Auflistungsversion in fast allen Fällen.
quelle
Wenn Sie nur die Erweiterung entfernen möchten:
Es funktioniert mit jeder Erweiterung, wobei potenzielle andere Punkte auch im Dateinamen vorhanden sind. Es teilt die Zeichenfolge einfach als Liste auf Punkte und verbindet sie ohne das letzte Element.
quelle
Ich möchte diese Antwort als den ausdrucksstärksten Weg wiederholen. Folgendes würde natürlich weniger CPU-Zeit in Anspruch nehmen:
Wenn jedoch die CPU der Flaschenhals ist, warum in Python schreiben?
Wann ist CPU überhaupt ein Flaschenhals? Vielleicht bei Fahrern.
Die Vorteile der Verwendung von regulären Ausdrücken liegen in der Wiederverwendbarkeit von Code. Was ist, wenn Sie als nächstes '.me' entfernen möchten, das nur drei Zeichen enthält?
Der gleiche Code würde den Trick machen:
quelle
In meinem Fall musste ich eine Ausnahme auslösen, also tat ich Folgendes:
quelle
Hier habe ich einen einfachsten Code.
quelle
Angenommen, Sie möchten die Domain entfernen, unabhängig davon, um was es sich handelt (.com, .net usw.). Ich empfehle, das zu finden
.
und alles von diesem Punkt an zu entfernen.Hier verwende ich
rfind
, um das Problem von URLs zu lösen, dieabcdc.com.net
auf den Namen reduziert werden solltenabcdc.com
.Wenn Sie auch über
www.
s besorgt sind , sollten Sie explizit nach ihnen suchen:Die 1 in Ersetzen ist für seltsame Randfälle wie
www.net.www.com
Wenn Ihre URL wilder wird, sehen Sie sich die Regex-Antworten an, mit denen die Leute geantwortet haben.
quelle
Ich habe die eingebaute rstrip- Funktion verwendet, um Folgendes zu tun:
quelle
"test.ccom"
.Sie können split verwenden:
quelle
a = 'www.computerbugs.com'
dies mit'www
'Dies ist eine perfekte Verwendung für reguläre Ausdrücke:
quelle
Python> = 3.9:
Python <3.9:
quelle