web-dev-qa-db-fra.com

Comment puis-je supprimer une sous-chaîne de la fin d'une chaîne en Python?

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?

313
Ramya

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)
470
Steef

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',''))
68
Charles Collis
def strip_end(text, suffix):
    if not text.endswith(suffix):
        return text
    return text[:len(text)-len(suffix)]
38
yairchu

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.

35
user3129181

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]
22
dagw

En une ligne:

text if not text.endswith(suffix) or len(suffix) == 0 else text[:-len(suffix)]
10
David Foster

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.

8
JohnMetta

Qu'en est-il de url[:-4]?

7
Daren Thomas

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.

6
JHolta

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]
2
winni2k
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'
1
user1854182

C'est une utilisation parfaite pour les expressions régulières:

>>> import re
>>> re.match(r"(.*)\.com", "hello.com").group(1)
'hello'
0
Aaron Maenpaa

Ou vous pouvez utiliser split:

a = 'abccomputer.com'
res = a.split('.com',1)[0]
0
Lucas
def remove_file_type(infile):
import re
return(re.sub('\.[^.]*$','',infile))
remove_file_type('abc.efg')'abc'
0
user3847438

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.

0
Dcs

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)]
0
juan Isaza