Comment supprimer un caractère d'une chaîne à l'aide de Python


458

Il y a une chaîne, par exemple. EXAMPLE.

Comment puis-je supprimer le caractère du milieu, c'est-à-dire Mde lui? Je n'ai pas besoin du code. Je veux savoir:

  • Les chaînes en Python se terminent-elles par un caractère spécial?
  • Quelle est la meilleure façon - de tout déplacer de droite à gauche à partir du caractère du milieu OU de la création d'une nouvelle chaîne sans copier le caractère du milieu?

Réponses:


639

En Python, les chaînes sont immuables, vous devez donc créer une nouvelle chaîne. Vous avez quelques options sur la façon de créer la nouvelle chaîne. Si vous souhaitez supprimer le «M» partout où il apparaît:

newstr = oldstr.replace("M", "")

Si vous souhaitez supprimer le caractère central:

midlen = len(oldstr)/2   # //2 in python 3
newstr = oldstr[:midlen] + oldstr[midlen+1:]

Vous avez demandé si les chaînes se terminent par un caractère spécial. Non, vous pensez comme un programmeur C. En Python, les chaînes sont stockées avec leur longueur, donc toute valeur d'octet, y compris \0, peut apparaître dans une chaîne.


16
Étant donné que l'interrogateur est tout nouveau en python, il peut être intéressant de noter que, tandis que dans la version 2.X python, l'opérateur "/" renvoie un entier (tronqué vers zéro), dans la version 3.X python, vous devez utiliser "//" au lieu. De plus, la ligne from __future__ import divisionau début de votre script fera que la version 2.X python agira comme la version 3.X
Michael Dunn

1
Notez que si "M" est le seul contenu de la ligne, "" laisse une ligne vide à sa place.
8bitjunkie

1
@ 7SpecialGems cela dépend entièrement de ce que vous faites avec cette chaîne. Une chaîne vide comme ""n'implique pas une ligne vide. Si vous le mettez dans une liste et que vous le joignez à des sauts de ligne, cela fera une ligne vide, mais il y a beaucoup d'autres endroits où vous pouvez utiliser une chaîne vide qui ne le fera pas.
Ned Batchelder

68

C'est probablement le meilleur moyen:

original = "EXAMPLE"
removed = original.replace("M", "")

Ne vous inquiétez pas de changer de personnage, etc. La plupart du code Python se déroule à un niveau d'abstraction beaucoup plus élevé.


6
Mpourrait ne pas être unique. Dans ce cas, cela remplacera tous les Ms, non?
Lazer

14
Oui c'est correct. Si vous souhaitez uniquement remplacer les noccurrences, utilisez original.replace("M", "", n).
récursif

1
@ S.Lott J'ai pris cela pour de la rhétorique, pour suggérer de fournir la solution pour ne remplacer qu'une seule instance
Dodgie

63

Pour remplacer un poste spécifique:

s = s[:pos] + s[(pos+1):]

Pour remplacer un caractère spécifique:

s = s.replace('M','')

18
Bien que cela puisse fonctionner, je pense que votre réponse pourrait être améliorée en expliquant ce qui se passe dans la première partie, car les opérations de sous-chaîne ne sont pas nécessairement faciles à comprendre pour un débutant Python sans aucune explication.
jloubert

Donc, si la longueur de s est l. Ensuite, pour la première partie, la contrainte pour pos devrait être l-1 > pos >= 0.
Haoyu Chen

s [: pos] obtient la sous-chaîne de 0 à pos-1 et s [(pos + 1):] obtient la sous-chaîne de pos + 1 à la fin. Par conséquent, il supprime s [pos] de l'art.
s.singh

il ne remplace pas, il tombe. il est bon de distinguer l'opération en fournissant des exemples pour les deux cas d'utilisation principaux, séparés par leur méthode de sélection de position.
Alexander Stohr

28

Les cordes sont immuables. Mais vous pouvez les convertir en liste, qui est modifiable, puis reconvertir la liste en chaîne après l'avoir modifiée.

s = "this is a string"

l = list(s)  # convert to list

l[1] = ""    # "delete" letter h (the item actually still exists but is empty)
l[1:2] = []  # really delete letter h (the item is actually removed from the list)
del(l[1])    # another way to delete it

p = l.index("a")  # find position of the letter "a"
del(l[p])         # delete it

s = "".join(l)  # convert back to string

Vous pouvez également créer une nouvelle chaîne, comme d'autres l'ont montré, en prenant tout sauf le caractère souhaité de la chaîne existante.


4
Pourquoi ne pas simplement utiliser la str.replaceméthode?
alichaudry

12

Comment puis-je supprimer le caractère du milieu, c'est-à-dire M?

Vous ne pouvez pas, car les chaînes en Python sont immuables .

Les chaînes en Python se terminent-elles par un caractère spécial?

Non. Ils sont similaires aux listes de personnages; la longueur de la liste définit la longueur de la chaîne et aucun caractère n'agit comme terminateur.

Quelle est la meilleure façon - de tout déplacer de droite à gauche à partir du caractère du milieu OU de la création d'une nouvelle chaîne sans copier le caractère du milieu?

Vous ne pouvez pas modifier la chaîne existante, vous devez donc en créer une nouvelle contenant tout sauf le caractère du milieu.


11

Utilisez la translate()méthode:

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'

3
La méthode a changé. Voir les documents pour Python 3: translate () Ceci remplace différents caractères par de l'espace ( Nonepour supprimer semble ne pas fonctionner):translate( str.maketrans("<>", " ") )
gérer

1
En fait, les documents spécifient deux façons de supprimer différents caractères avec translate () en Python 3,: str.maketrans( "", "", "<>")etstr.maketrans( {"<":None,">":None })
gérer

3
L'équivalent du code dans la réponse est devenu ceci en python3:'EXAMPLE'.translate({ord("M"): None})
yoniLavi


6
card = random.choice(cards)
cardsLeft = cards.replace(card, '', 1)

Comment supprimer un caractère d'une chaîne: Voici un exemple où il y a une pile de cartes représentées sous forme de caractères dans une chaîne. L'un d'eux est dessiné (importer un module aléatoire pour la fonction random.choice (), qui choisit un caractère aléatoire dans la chaîne). Une nouvelle chaîne, cardsLeft, est créée pour contenir les cartes restantes fournies par la fonction de chaîne replace () où le dernier paramètre indique qu'une seule "carte" doit être remplacée par la chaîne vide ...


6
def kill_char(string, n): # n = position of which character you want to remove
    begin = string[:n]    # from beginning to n (n not included)
    end = string[n+1:]    # n+1 through end of string
    return begin + end
print kill_char("EXAMPLE", 3)  # "M" removed

J'ai vu ça quelque part ici .


4

Voici ce que j'ai fait pour découper le "M":

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]

2
Cela ne fonctionnerait que cette chaîne spécifique et n'est pas une solution générale.
Andreas Bergström

3

Si vous souhaitez supprimer / ignorer des caractères dans une chaîne, et, par exemple, vous avez cette chaîne,

"[11: L: 0]"

à partir d'une réponse API Web ou quelque chose comme ça, comme un fichier CSV, disons que vous utilisez des demandes

import requests
udid = 123456
url = 'http://webservices.yourserver.com/action/id-' + udid
s = requests.Session()
s.verify = False
resp = s.get(url, stream=True)
content = resp.content

boucle et se débarrasser des caractères indésirables:

for line in resp.iter_lines():
  line = line.replace("[", "")
  line = line.replace("]", "")
  line = line.replace('"', "")

Fractionnement facultatif, et vous pourrez lire les valeurs individuellement:

listofvalues = line.split(':')

Il est désormais plus facile d'accéder à chaque valeur:

print listofvalues[0]
print listofvalues[1]
print listofvalues[2]

Cela imprimera

11

L

0


3

Pour supprimer un charou une sub-string fois (uniquement la première occurrence):

main_string = main_string.replace(sub_str, replace_with, 1)

REMARQUE: ici 1peut être remplacé par any intpour le nombre d'occurrences que vous souhaitez remplacer.


3

Vous pouvez simplement utiliser la compréhension de liste.

Supposons que vous avez la chaîne: my name iset que vous souhaitez supprimer le caractère m. utilisez le code suivant:

"".join([x for x in "my name is" if x is not 'm'])

0
from random import randint


def shuffle_word(word):
    newWord=""
    for i in range(0,len(word)):
        pos=randint(0,len(word)-1)
        newWord += word[pos]
        word = word[:pos]+word[pos+1:]
    return newWord

word = "Sarajevo"
print(shuffle_word(word))

2
Bien que cet extrait de code puisse résoudre la question, y compris une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondrez à la question des lecteurs à l'avenir et que ces personnes ne connaissent peut-être pas les raisons de votre suggestion de code.
andreas

0

Une autre façon est avec une fonction,

Vous trouverez ci-dessous un moyen de supprimer toutes les voyelles d'une chaîne, simplement en appelant la fonction

def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")

-7

Les chaînes sont immuables en Python, donc vos deux options signifient essentiellement la même chose.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.