Python Supprime les 3 derniers caractères d'une chaîne

146

J'essaie de supprimer les 3 derniers caractères d'une chaîne en python, je ne sais pas ce que sont ces caractères donc je ne peux pas utiliser rstrip, j'ai également besoin de supprimer tout espace blanc et de convertir en majuscules

un exemple serait:

foo = "Bs12 3ab"
foo.replace(" ", "").rstrip(foo[-3:]).upper()

Cela fonctionne et me donne BS12 qui est ce que je veux, mais si les 4ème et 3ème derniers caractères sont les mêmes, je perds les deux, par exemple si foo = "BS11 1AA"je viens de recevoir'BS'

des exemples de foopourraient être:

BS1 1AB
bs11ab
BS111ab

La chaîne peut contenir 6 ou 7 caractères et je dois supprimer les 3 derniers (en supposant qu'il n'y a pas d'espace blanc)

Des conseils?

Sam Machin
la source

Réponses:

278

Suppression de tous les espaces:

foo = ''.join(foo.split())

Suppression des trois derniers caractères:

foo = foo[:-3]

Conversion en majuscules:

foo = foo.upper()

Tout ce code en une seule ligne:

foo = ''.join(foo.split())[:-3].upper()
Noctis Skytower
la source
9
Je voudrais noter que ''.join(foo.split())c'est mieux que foo.replace(' ', ''), lorsqu'il est utilisé sur des chaînes Unicode, car il supprime tout caractère d' espacement , en plus du ' 'caractère (en particulier, les espaces insécables sont également supprimés). Cela dit, replace()c'est probablement beaucoup plus rapide, donc il peut être utilisé si, par exemple, les chaînes d'entrée sont connues pour être codées en ASCII, qui n'a qu'un seul caractère d'espace (j'utilise la terminologie Python 2, ici.)
Eric O Lebigot
90

Cela ne fonctionne pas comme prévu car la bande est basée sur des caractères. Vous devez le faire à la place:

foo = foo.replace(' ', '')[:-3].upper()
Nadia Alramli
la source
11
Cela ne supprime pas WHITESPACE comme l'OP l'a demandé; il supprime uniquement les caractères ESPACE.
John Machin
15
>>> foo = "Bs12 3ab"
>>> foo[:-3]
'Bs12 '
>>> foo[:-3].strip()
'Bs12'
>>> foo[:-3].strip().replace(" ","")
'Bs12'
>>> foo[:-3].strip().replace(" ","").upper()
'BS12'
ghostdog74
la source
2
@Lidia Oui, strip supprime uniquement les espaces du début et de la fin de la chaîne.
Eliezer Miron
Il convient de noter que vous ne pouvez pas enchaîner ceci par exemple foo [3:] foo [: - 3]
crafter
9

Vous avez peut-être mal compris légèrement rstrip, il ne supprime pas une chaîne mais n'importe quel caractère de la chaîne que vous spécifiez.

Comme ça:

>>> text = "xxxxcbaabc"
>>> text.rstrip("abc")
'xxxx'

Alors à la place, utilisez simplement

text = text[:-3] 

(après avoir remplacé les espaces par rien)

Mattias Nilsson
la source
3
>>> foo = 'BS1 1AB'
>>> foo.replace(" ", "").rstrip()[:-3].upper()
'BS1'
SilentGhost
la source
3

J'essaie d'éviter les expressions régulières, mais cela semble fonctionner:

string = re.sub("\s","",(string.lower()))[:-3]

krs1
la source
1
string.lower () doit être string.upper (). Mon erreur.
krs1
c'est la seule solution qui traite bien les espaces
Erik Aronesty
1

Quel est le problème avec ça?

foo.replace(" ", "")[:-3].upper()
abyx
la source
1
  1. split
  2. slice
  3. concentrate

C'est un bon entraînement pour les débutants et c'est facile à réaliser.

Une autre méthode avancée est une fonction comme celle-ci:

def trim(s):
    return trim(s[slice])

Et pour cette question, vous voulez simplement supprimer les derniers caractères, vous pouvez donc écrire comme ceci:

def trim(s):
    return s[ : -3] 

Je pense que vous êtes prêt à vous soucier de ce que sont ces trois personnages, alors vous avez perdu. Vous voulez juste supprimer les trois derniers, mais qui ils sont!

Si vous souhaitez supprimer certains caractères spécifiques, vous pouvez en ajouter des jugements:

def trim(s):
    if [conditions]:   ### for some cases, I recommend using isinstance().
        return trim(s[slice])
Jaylin
la source
0

N'effectuez-vous pas les opérations dans le mauvais ordre? Votre exigence semble êtrefoo[:-3].replace(" ", "").upper()

AndreaG
la source
pointe sur ce qui suit dans la question >>> (en supposant qu'il n'y a pas d'espace blanc)
Noctis Skytower
0

Cela dépend de votre définition des espaces. J'appellerais généralement les espaces comme des espaces, des tabulations, des sauts de ligne et des retours chariot. Si c'est votre définition, vous souhaitez utiliser une expression régulière avec \ s pour remplacer tous les caractères d'espacement:

import re

def myCleaner(foo):
    print 'dirty: ', foo
    foo = re.sub(r'\s', '', foo)
    foo = foo[:-3]
    foo = foo.upper()
    print 'clean:', foo
    print

myCleaner("BS1 1AB")
myCleaner("bs11ab")
myCleaner("BS111ab")
Lee Joramo
la source