J'ai le code suivant:
url = 'abcdc.com'
print(url.strip('.com'))
Je m'attendais à: abcdc
J'ai: abcd
Maintenant oui
url.rsplit('.com', 1)
Y a-t-il un meilleur moyen?
strip
ne signifie pas "supprime cette sous-chaîne". x.strip(y)
traite y
comme un ensemble de caractères et supprime tous les caractères de cet ensemble des extrémités de x
.
Au lieu de cela, vous pouvez utiliser endswith
et découper:
url = 'abcdc.com'
if url.endswith('.com'):
url = url[:-4]
Ou en utilisant des expressions régulières:
import re
url = 'abcdc.com'
url = re.sub('\.com$', '', url)
Si vous êtes sûr que la chaîne n'apparaît qu'à la fin, la méthode la plus simple consiste à utiliser 'replace':
url = 'abcdc.com'
print(url.replace('.com',''))
def strip_end(text, suffix):
if not text.endswith(suffix):
return text
return text[:len(text)-len(suffix)]
Comme il semble que personne ne l’a encore signalé:
url = "www.example.com"
new_url = url[:url.rfind(".")]
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 comportant plusieurs points.
Cela dépend de ce que vous savez sur votre URL et de ce que vous essayez de faire. Si vous savez que cela finira 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 ferez probablement mieux de consulter la bibliothèque urlparse fournie avec python.
Par contre, si vous voulez simplement tout supprimer après le "." Final. dans une ficelle alors
url.rsplit('.',1)[0]
marchera. Ou si vous voulez, vous voulez juste tout jusqu'au début '.' Alors essaye
url.split('.',1)[0]
En une ligne:
text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
Si vous savez que c'est une extension, alors
url = 'abcdc.com'
...
url.rsplit('.', 1)[0] # split at '.', starting from the right, maximum 1 split
Cela fonctionne aussi bien avec abcdc.com
ou www.abcdc.com
ou abcdc.[anything]
et est plus extensible.
Qu'en est-il de url[:-4]
?
Pour les URL (comme cela semble être une partie du sujet dans l'exemple donné), on peut faire quelque chose comme ceci:
import os
url = 'http://www.stackoverflow.com'
name,ext = os.path.splitext(url)
print (name, ext)
#Or:
ext = '.'+url.split('.')[-1]
name = url[:-len(ext)]
print (name, ext)
Les deux vont sortir: ('http://www.stackoverflow', '.com')
Ceci peut également être combiné avec str.endswith(suffix)
si vous devez simplement diviser ".com", ou quelque chose de spécifique.
url.rsplit ('.com', 1)
ce n'est pas tout à fait raison.
Ce que vous auriez réellement besoin d'écrire, c'est
url.rsplit('.com', 1)[0]
, et ça semble assez succinct à mon humble avis.
Cependant, ma préférence personnelle est cette option car elle utilise un seul paramètre:
url.rpartition('.com')[0]
import re
def rm_suffix(url = 'abcdc.com', suffix='\.com'):
return(re.sub(suffix+'$', '', url))
Je tiens à répéter cette réponse comme le moyen le plus expressif de le faire. Bien sûr, ce qui suit prendrait moins de temps processeur
def rm_dotcom(url = 'abcdc.com'):
return(url[:-4] if url.endswith('.com') else url)
Cependant, si le processeur est le goulot d'étranglement, pourquoi écrire en Python?
Quand le processeur est-il un goulot de bouteille de toute façon ?? dans les pilotes, peut-être.
Les avantages de l'utilisation d'expressions régulières sont la possibilité de réutilisation du code. Que faire si vous voulez ensuite supprimer ".me", qui ne comporte que trois caractères?
Le même code ferait l'affaire.
>>> rm_sub('abcdc.me','.me')
'abcdc'
C'est une utilisation parfaite pour les expressions régulières:
>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
Ou vous pouvez utiliser split:
a = 'abccomputer.com'
res = a.split('.com',1)[0]
def remove_file_type(infile):
import re
return(re.sub('\.[^.]*$','',infile))
remove_file_type('abc.efg')'abc'
Si vous ne voulez dénuder que l'extension
url = 'abcdc.com'
print('.'.join(url.split('.')[:-1]))
Cela fonctionne avec n'importe quelle extension, avec d'autres points potentiels existant dans le nom du fichier. Il scinde simplement une chaîne en une liste de points et la joint sans dernier élément.
Probablement pas le plus rapide, mais pour moi, c'est plus lisible que d'autres méthodes.
Dans mon cas, je devais lever une exception alors je l’ai fait:
class UnableToStripEnd(Exception):
"""A Exception type to indicate that the suffix cannot be removed from the text."""
@staticmethod
def get_exception(text, suffix):
return UnableToStripEnd("Could not find suffix ({0}) on text: {1}."
.format(suffix, text))
def strip_end(text, suffix):
"""Removes the end of a string. Otherwise fails."""
if not text.endswith(suffix):
raise UnableToStripEnd.get_exception(text, suffix)
return text[:len(text)-len(suffix)]