strip supprime les caractères donnés aux deux extrémités de la chaîne, dans votre cas, il supprime ".", "c", "o" et "m".
truppo
6
Il supprimera également ces caractères à l'avant de la chaîne. Si vous voulez juste le supprimer de la fin, utilisez rstrip ()
Andre Miller
42
Ouais. str.strip ne fait pas ce que vous pensez qu'il fait. str.strip supprime l'un des caractères spécifiés depuis le début et la fin de la chaîne. Ainsi, "acbacda" .strip ("ad") donne 'cbac'; le a au début et le da à la fin ont été dépouillés. À votre santé.
scvalex
2
De plus, cela supprime les caractères dans n'importe quel ordre : "site.ocm"> "site".
Eric O Lebigot
1
@scvalex, wow vient de réaliser cela après l'avoir utilisé de cette façon depuis des lustres - c'est dangereux parce que le code fonctionne souvent de toute façon
Flash
Réponses:
557
stripne signifie pas "supprimer cette sous-chaîne". x.strip(y)traite ycomme un ensemble de caractères et supprime tous les caractères de cet ensemble depuis la fin de x.
Au lieu de cela, vous pouvez utiliser endswithet découper:
Oui, je pense moi-même que le premier exemple, avec le test endswith (), serait le meilleur; le regex impliquerait une certaine pénalité de performance (analyse du regex, etc.). Je n'irais pas avec le rsplit (), mais c'est parce que je ne sais pas ce que vous essayez exactement de réaliser. Je suppose que cela supprime le .com si et seulement s'il apparaît à la fin de l'url? La solution rsplit vous poserait des problèmes si vous l'utilisiez sur des noms de domaine comme 'www.commercialthingie.co.uk'
Steef
13
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
Burhan Khalid
1
que faire si j'écris des EXAMLPLE.COMnoms de domaine ne sont pas sensibles à la casse. (Ceci est un vote pour la solution regex)
Jasen
3
Ce n'est pas une réécriture, la rsplit()solution n'a pas le même comportement que endswith()celle lorsque la chaîne d'origine n'a pas la sous-chaîne à la fin, mais quelque part au milieu. Par exemple: "www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"mais"www.comeandsee.net".rsplit(".com",1)[0] == "www"
Steef
1
La syntaxe s[:-n]a une mise en garde: car n = 0, cela ne renvoie pas la chaîne avec le dernier zéro coupé, mais la chaîne vide à la place.
BlenderBender
90
Si vous êtes sûr que la chaîne n'apparaît qu'à la fin, alors le moyen le plus simple serait d'utiliser 'replace':
qui remplacera également l'URL comme www.computerhope.com. vérifiez avec endswith()et ça devrait aller.
ghostdog74
72
"www.computerhope.com".endswith(".com")c'est vrai, ça va encore casser!
1
"Si vous êtes sûr que la chaîne n'apparaît qu'à la fin" voulez-vous dire "Si vous êtes sûr que la sous-chaîne n'apparaît qu'une seule fois"? remplacer semble fonctionner également lorsque la sous-chaîne est au milieu, mais comme l'autre commentaire le suggère, il remplacera toute occurrence de la sous-chaîne, pourquoi cela devrait être à la fin, je ne comprends pas
Cela devrait être plus efficace que les méthodes utilisant split()car aucun nouvel objet de liste n'est créé, et cette solution fonctionne pour les chaînes avec plusieurs points.
Wow, c'est un bon truc. Je n'arrivais pas à faire en sorte que cela échoue, mais j'ai également eu du mal à trouver des moyens pour que cela échoue. Je l'aime bien mais c'est très "magique", difficile de savoir ce que ça fait en le regardant. J'ai dû traiter mentalement chaque partie de la ligne pour "l'obtenir".
DevPlayer
14
Cela échoue si la chaîne recherchée n'est PAS présente et supprime à tort le dernier caractère à la place.
robbat2
25
Cela dépend de ce que vous savez sur votre URL et de ce que vous essayez de faire. Si vous savez qu'il se terminera toujours par «.com» (ou «.net» ou «.org»), alors
url=url[:-4]
est la solution la plus rapide. S'il s'agit d'URL plus générales, vous feriez probablement mieux de consulter la bibliothèque urlparse fournie avec python.
Si vous, par contre, vous voulez simplement tout supprimer après la finale "." dans une chaîne puis
url.rsplit('.',1)[0]
marchera. Ou si vous voulez juste tout vouloir jusqu'au premier '.' Alors essaye
Si vous devez supprimer une fin de chaîne si elle existe, ne faites rien. Mes meilleures solutions. Vous voudrez probablement utiliser l'une des 2 premières implémentations, mais j'ai inclus la 3e pour être complet.
Pour un suffixe constant:
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'
Pour une collection de suffixes constants, le moyen asymptotiquement le plus rapide pour un grand nombre d'appels:
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')
le dernier est probablement beaucoup plus rapide en pypy qu'en cpython. La variante regex est probablement plus rapide que cela pour pratiquement tous les cas qui n'impliquent pas d'énormes dictionnaires de suffixes potentiels qui ne peuvent pas être facilement représentés comme une expression régulière au moins dans cPython.
Dans PyPy, la variante d'expression régulière est presque certainement plus lente pour un grand nombre d'appels ou de longues chaînes même si le module re utilise un moteur d'expression régulière de compilation DFA car la grande majorité des frais généraux des lambda sera optimisée par le JIT.
En cPython cependant, le fait que votre code c en cours d'exécution pour l'expression régulière compare presque certainement les avantages algorithmiques de la version de la collection de suffixes dans presque tous les cas.
Lorsque a = 'www.computerbugs.com'cela résulte avec 'www'
yairchu
2
Si vous souhaitez supprimer uniquement l'extension:
'.'.join('abcdc.com'.split('.')[:-1])# 'abcdc'
Il fonctionne avec n'importe quelle extension, avec d'autres points potentiels existant également dans le nom de fichier. Il fractionne simplement la chaîne sous forme de liste sur des points et la joint sans le dernier élément.
Cependant, si le CPU est le goulot d'étranglement, pourquoi écrire en Python?
Quand est-ce que le CPU est un goulot d'étranglement? Dans les pilotes, peut-être.
Les avantages de l'utilisation d'une expression régulière sont la réutilisation du code. Que faire si vous souhaitez ensuite supprimer «.me», qui ne comporte que trois caractères?
Dans mon cas, je devais lever une exception, alors j'ai fait:
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)]
En supposant que vous souhaitiez supprimer le domaine, quel qu'il soit (.com, .net, etc.). Je recommande de trouver .et de supprimer tout à partir de ce moment.
Mais ce n'est pas le point de la question. Il a juste été demandé de supprimer une sous-chaîne connue de la fin d'une autre. Cela fonctionne exactement comme prévu.
Alex
0
C'est une utilisation parfaite pour les expressions régulières:
>>>import re
>>> re.match(r"(.*)\.com","hello.com").group(1)'hello'
Votre réponse pour Python 3.9 est un double de cette réponse ci-dessus. Votre réponse pour les versions précédentes a également été répondue plusieurs fois dans ce fil et ne retournerait rien si la chaîne n'a pas le suffixe.
Réponses:
strip
ne signifie pas "supprimer cette sous-chaîne".x.strip(y)
traitey
comme un ensemble de caractères et supprime tous les caractères de cet ensemble depuis la fin dex
.Au lieu de cela, vous pouvez utiliser
endswith
et découper:Ou en utilisant des expressions régulières :
la source
url = url[:-4] if any(url.endswith(x) for x in ('.com','.net')) else url
EXAMLPLE.COM
noms de domaine ne sont pas sensibles à la casse. (Ceci est un vote pour la solution regex)rsplit()
solution n'a pas le même comportement queendswith()
celle lorsque la chaîne d'origine n'a pas la sous-chaîne à la fin, mais quelque part au milieu. Par exemple:"www.comeandsee.com".rsplit(".com",1)[0] == "www.comeandsee"
mais"www.comeandsee.net".rsplit(".com",1)[0] == "www"
s[:-n]
a une mise en garde: carn = 0
, cela ne renvoie pas la chaîne avec le dernier zéro coupé, mais la chaîne vide à la place.Si vous êtes sûr que la chaîne n'apparaît qu'à la fin, alors le moyen le plus simple serait d'utiliser 'replace':
la source
www.computerhope.com
. vérifiez avecendswith()
et ça devrait aller."www.computerhope.com".endswith(".com")
c'est vrai, ça va encore casser!la source
return text[:-len(suffix)]
Puisqu'il semble que personne ne l'a encore souligné:
Cela devrait être plus efficace que les méthodes utilisant
split()
car aucun nouvel objet de liste n'est créé, et cette solution fonctionne pour les chaînes avec plusieurs points.la source
Cela dépend de ce que vous savez sur votre URL et de ce que vous essayez de faire. Si vous savez qu'il se terminera toujours par «.com» (ou «.net» ou «.org»), alors
est la solution la plus rapide. S'il s'agit d'URL plus générales, vous feriez probablement mieux de consulter la bibliothèque urlparse fournie avec python.
Si vous, par contre, vous voulez simplement tout supprimer après la finale "." dans une chaîne puis
marchera. Ou si vous voulez juste tout vouloir jusqu'au premier '.' Alors essaye
la source
Si vous savez que c'est une extension, alors
Cela fonctionne aussi bien avec
abcdc.com
ouwww.abcdc.com
ouabcdc.[anything]
et est plus extensible.la source
En une seule ligne:
la source
Et alors
url[:-4]
?la source
.ca
ou une.co.uk
URL.Pour les URL (comme cela semble faire partie du sujet par l'exemple donné), on peut faire quelque chose comme ceci:
Les deux produiront:
('http://www.stackoverflow', '.com')
Cela peut également être combiné avec
str.endswith(suffix)
si vous avez juste besoin de diviser ".com", ou quelque chose de spécifique.la source
n'est pas tout à fait raison.
Ce que vous auriez réellement besoin d'écrire est
, et il semble IMHO assez succinct.
Cependant, ma préférence personnelle est cette option car elle n'utilise qu'un seul paramètre:
la source
À partir de
Python 3.9
, vous pouvez utiliser à laremovesuffix
place:la source
Si vous devez supprimer une fin de chaîne si elle existe, ne faites rien. Mes meilleures solutions. Vous voudrez probablement utiliser l'une des 2 premières implémentations, mais j'ai inclus la 3e pour être complet.
Pour un suffixe constant:
Pour une expression régulière:
Pour une collection de suffixes constants, le moyen asymptotiquement le plus rapide pour un grand nombre d'appels:
le dernier est probablement beaucoup plus rapide en pypy qu'en cpython. La variante regex est probablement plus rapide que cela pour pratiquement tous les cas qui n'impliquent pas d'énormes dictionnaires de suffixes potentiels qui ne peuvent pas être facilement représentés comme une expression régulière au moins dans cPython.
Dans PyPy, la variante d'expression régulière est presque certainement plus lente pour un grand nombre d'appels ou de longues chaînes même si le module re utilise un moteur d'expression régulière de compilation DFA car la grande majorité des frais généraux des lambda sera optimisée par le JIT.
En cPython cependant, le fait que votre code c en cours d'exécution pour l'expression régulière compare presque certainement les avantages algorithmiques de la version de la collection de suffixes dans presque tous les cas.
la source
Vous pouvez utiliser split:
la source
a = 'www.computerbugs.com'
cela résulte avec'www
'Si vous souhaitez supprimer uniquement l'extension:
Il fonctionne avec n'importe quelle extension, avec d'autres points potentiels existant également dans le nom de fichier. Il fractionne simplement la chaîne sous forme de liste sur des points et la joint sans le dernier élément.
la source
Je veux répéter cette réponse comme la manière la plus expressive de le faire. Bien sûr, ce qui suit prendrait moins de temps CPU:
Cependant, si le CPU est le goulot d'étranglement, pourquoi écrire en Python?
Quand est-ce que le CPU est un goulot d'étranglement? Dans les pilotes, peut-être.
Les avantages de l'utilisation d'une expression régulière sont la réutilisation du code. Que faire si vous souhaitez ensuite supprimer «.me», qui ne comporte que trois caractères?
Le même code ferait l'affaire:
la source
Dans mon cas, je devais lever une exception, alors j'ai fait:
la source
Ici, j'ai un code le plus simple.
la source
En supposant que vous souhaitiez supprimer le domaine, quel qu'il soit (.com, .net, etc.). Je recommande de trouver
.
et de supprimer tout à partir de ce moment.Ici, j'utilise
rfind
pour résoudre le problème des URL comme cellesabcdc.com.net
qui devraient être réduites au nomabcdc.com
.Si vous êtes également préoccupé par les
www.
s, vous devez les vérifier explicitement:Le 1 en remplacement est pour les cas étranges comme
www.net.www.com
Si votre URL devient plus sauvage que cela, regardez les réponses regex avec lesquelles les gens ont répondu.
la source
J'ai utilisé la fonction rstrip intégrée pour le faire comme suit:
la source
"test.ccom"
.C'est une utilisation parfaite pour les expressions régulières:
la source
Python> = 3,9:
Python <3,9:
la source