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?
Lazer
la source

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.

Ned Batchelder
la source
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é.

récursif
la source
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','')
Eton B.
la source
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.

gentil
la source
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.

Richard Fearn
la source
11

Utilisez la translate()méthode:

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'
Stefan van den Akker
la source
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
7

UserString.MutableString

Façon mutable:

import UserString

s = UserString.MutableString("EXAMPLE")

>>> type(s)
<type 'str'>

# Delete 'M'
del s[3]

# Turn it for immutable:
s = str(s)
tuer
la source
3
Site Web 404 sans importation
quelque chose du
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 ...

StaffanRolfsson
la source
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 .

user1443297
la source
4

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

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]
PaulM
la source
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

d1jhoni1b
la source
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.

Blackeard
la source
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'])
hubert
la source
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))
Fahrudin Halilović
la source
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")
Kyoujin
la source
-7

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

Skilldrick
la source