Changement d'un caractère dans une chaîne de caractères?

Quel est le moyen le plus simple en Python de remplacer un caractère dans une chaîne comme:

text = "abcdefg";
text[1] = "Z";
           ^
270
demandé sur martineau 2009-08-04 19:48:39

9 réponses

Ne modifiez pas les chaînes.

Travaillez avec eux en tant que listes; transformez-les en chaînes uniquement si nécessaire.

>>> s = list("Hello zorld")
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'z', 'o', 'r', 'l', 'd']
>>> s[6] = 'W'
>>> s
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> "".join(s)
'Hello World'

Les chaînes Python sont immuables (c'est-à-dire qu'elles ne peuvent pas être modifiées). Il y a beaucoup {[7] } de raisons à cela. Utilisez des listes jusqu'à ce que vous n'ayez pas le choix, seulement ensuite les transformer en chaînes.

389
répondu scvalex 2009-08-04 16:41:07

Méthode la plus rapide?

Il y a trois façons. Pour les amateurs de vitesse, je recommande 'Méthode 2'

Méthode 1

Cette réponse

text = 'abcdefg'
new = list(text)
new[6] = 'W'
''.join(new)

Ce qui est assez lent par rapport à la 'méthode 2'

timeit.timeit("text = 'abcdefg'; s = list(text); s[6] = 'W'; ''.join(s)", number=1000000)
1.0411581993103027

Méthode 2 (MÉTHODE RAPIDE)

Cette réponse

text = 'abcdefg'
text = text[:1] + 'Z' + text[2:]

, Qui est beaucoup plus rapide:

timeit.timeit("text = 'abcdefg'; text = text[:1] + 'Z' + text[2:]", number=1000000)
0.34651994705200195

Méthode 3:

Tableau d'Octets:

timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
1.0387420654296875
119
répondu Mehdi Nellen 2017-05-23 10:31:14
new = text[:1] + 'Z' + text[2:]
113
répondu Jochen Ritzel 2009-08-16 19:30:14

Les chaînes Python sont immuables, vous les modifiez en faisant une copie.
La façon la plus simple de faire ce que vous voulez est probablement.

text = "Z" + text[1:]

Le texte [1:] renvoie la chaîne dans le texte de la position 1 à la fin, les positions comptent à partir de 0 donc ' 1 ' est le deuxième caractère.

Modifier: Vous pouvez utiliser la même technique de tranchage de chaîne pour n'importe quelle partie de la chaîne

text = text[:1] + "Z" + text[2:]

Ou si la lettre n'apparaît qu'une fois que vous pouvez utiliser la technique de recherche et de remplacement suggérée ci-dessous

27
répondu Martin Beckett 2009-08-04 16:04:29

En commençant par Python 2.6 et python 3, vous pouvez utiliser des bytearrays qui sont mutables (peuvent être modifiés en fonction des éléments contrairement aux chaînes):

s = "abcdefg"
b_s = bytearray(s)
b_s[1] = "Z"
s = str(b_s)
print s
aZcdefg

Modifier: changé str à s

Edit2: comme alchimiste à deux bits mentionné dans les commentaires, ce code ne fonctionne pas avec unicode.

11
répondu Mahmoud 2015-11-30 09:27:58

Comme d'autres personnes l'ont dit, les chaînes Python sont généralement censées être immuables.

Cependant, si vous utilisez CPython, l'implémentation à python.org, il est possible d'utiliser ctypes pour modifier la structure de chaîne en mémoire.

Voici un exemple où j'utilise la technique pour effacer une chaîne.

Marquer les données comme sensibles dans python

Je mentionne cela par souci d'exhaustivité, et cela devrait être votre dernier recours car il est hackish.

4
répondu Unknown 2017-05-23 12:10:27

En Fait, avec des chaînes, vous pouvez faire quelque chose comme ceci:

oldStr = 'Hello World!'    
newStr = ''

for i in oldStr:  
    if 'a' < i < 'z':    
        newStr += chr(ord(i)-32)     
    else:      
        newStr += i
print(newStr)

'HELLO WORLD!'

Fondamentalement, je "ajoute" + "strings" ensemble dans une nouvelle chaîne :).

2
répondu user5587487 2015-11-20 21:46:46

Ce code n'est pas le mien. Je ne pouvais pas me rappeler la forme du site où, je l'ai pris. Fait intéressant, vous pouvez l'utiliser pour remplacer un caractère ou plus par un ou plusieurs charectors. Bien que cette réponse soit très tardive, les novices comme moi (à tout moment) pourraient le trouver utile.

Modifier la fonction de texte.

mytext = 'Hello Zorld'
mytext = mytext.replace('Z', 'W')
print mytext,
1
répondu K.Vee.Shanker. 2011-12-16 13:39:14

Un moyen très simple est de faire ceci:

word = "Heloo World!"
word = word.replace(word[3], "l", 1)
print word

Sortie:

 Hello World!
-2
répondu Nicholas Carr 2017-04-19 07:20:33