Comment supprimer tous les caractères après un caractère spécifique en python?

148

J'ai une ficelle. Comment supprimer tout le texte après un certain caractère? ( Dans ce cas... )
Le texte après ...changera donc c'est pourquoi je veux supprimer tous les caractères après un certain.

Solihull
la source
6
Si vous n'êtes pas sûr que cela ait du sens, mettez à jour votre question pour fournir des exemples spécifiques de ce que vous voulez faire.
S.Lott

Réponses:

259

Fendez au plus une fois sur votre séparateur et prenez le premier morceau:

sep = '...'
rest = text.split(sep, 1)[0]

Vous n'avez pas dit ce qui devrait se passer si le séparateur n'est pas présent. Cette solution et celle d'Alex renverront la chaîne entière dans ce cas.

Ned Batchelder
la source
La requête est "supprimer tout le texte après" le séparateur, pas "obtenir" ce texte, donc je pense que vous voulez [0], pas [-1], dans votre excellente solution par ailleurs.
Alex Martelli
Cela a fonctionné parfaitement merci, comme je suis sûr qu'Ayman et Alex l'ont fait aussi, alors merci à tous.
Solihull
5
Utilisez rsplit () si vous devez diviser par un caractère à partir de la fin de la chaîne.
Samuel
rsplit () répond en fait à la question s'il y a plusieurs occurrences du séparateur
Nate
94

En supposant que votre séparateur est '...', mais il peut s'agir de n'importe quelle chaîne.

text = 'some string... this part will be removed.'
head, sep, tail = text.partition('...')

>>> print head
some string

Si le séparateur n'est pas trouvé, headcontiendra toute la chaîne d'origine.

La fonction de partition a été ajoutée dans Python 2.5.

partition (...) S.partition (sep) -> (tête, sep, queue)

Searches for the separator sep in S, and returns the part before it,
the separator itself, and the part after it.  If the separator is not
found, returns S and two empty strings.
Ayman Hourieh
la source
Encore une excellente solution - violons-nous TOOOWTDI? -) Cela vaut peut-être la peine de courir pour vérifier ...
Alex Martelli
9
.partition gagne - 0,756 usec par boucle, contre 1,13 pour .split (le formatage des commentaires ne me permet pas vraiment de montrer les tests exacts, mais j'utilise le texte et le séparateur de @ Ayman) - donc, +1 pour la réponse de @ Ayman !
Alex Martelli
1
et btw, par souci d'exhaustivité, la solution basée sur RE est de 2,54 usec, c'est-à-dire beaucoup plus lente que celle de @ Ayman ou de @ Ned.
Alex Martelli
la partition gagne si vous êtes en 2.5 land :) Pour nous, les drageons coincés en 2.4, nous devons vivre avec une lenteur relativement glaciale de la scission.
Gregg Lind
L'exemple est vraiment utile.
Md. Sabbir Ahmed
18

Si vous souhaitez tout supprimer après la dernière occurrence de séparateur dans une chaîne, je trouve que cela fonctionne bien:

<separator>.join(string_to_split.split(<separator>)[:-1])

Par exemple, si string_to_splitest un chemin comme root/location/child/too_far.exeet que vous ne voulez que le chemin du dossier, vous pouvez diviser par "/".join(string_to_split.split("/")[:-1])et vous obtiendrez root/location/child

l'annonceur
la source
1
en outre, vous pouvez changer ce -1 en n'importe quel index pour qu'il soit l'occurrence à laquelle vous déposez du texte.
theannouncer le
10

Sans RE (ce que je suppose est ce que vous voulez):

def remafterellipsis(text):
  where_ellipsis = text.find('...')
  if where_ellipsis == -1:
    return text
  return text[:where_ellipsis + 3]

ou, avec un RE:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)
Alex Martelli
la source
Pourrait vouloir utiliser sep = '...' comme kwarg et utiliser len (sep) au lieu de coder en dur le 3 pour le rendre un peu plus à l'épreuve du temps.
cdleary
Oui, mais vous devez recompiler le RE à chaque appel, donc les performances en souffrent pour la solution RE (pas de réelle différence pour la solution non RE). Certaines généralités sont gratuites, d'autres non ... ;-)
Alex Martelli
@Alex - Merci d'avoir testé les solutions!
Ayman Hourieh
2

La méthode find renverra la position du caractère dans une chaîne. Ensuite, si vous voulez tout supprimer du personnage, procédez comme suit:

mystring = "123⋯567"
mystring[ 0 : mystring.index("⋯")]

>> '123'

Si vous souhaitez conserver le caractère, ajoutez 1 à la position du caractère.

Eduardo Freitas
la source
1
import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

Sortie: "Ceci est un test"

Marcus
la source
veuillez expliquer
lone_coder
1

À partir d'un fichier:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)
parikhparth23
la source
0

un autre moyen simple d'utiliser re sera

import re, clr

text = 'some string... this part will be removed.'

text= re.search(r'(\A.*)\.\.\..+',url,re.DOTALL|re.IGNORECASE).group(1)

// text = some string
Rohail
la source