Quelle est la manière la plus simple en Python de remplacer un caractère dans une chaîne?
Par exemple:
text = "abcdefg";
text[1] = "Z";
^
Ne modifiez pas les chaînes.
Travaillez avec eux sous forme de listes; les transformer en chaînes uniquement lorsque cela est 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 de raisons à cela. Utilisez des listes jusqu'à ce que vous n'ayez pas le choix, puis transformez-les en chaînes.
MID
cause des tranches:s[:index] + c + s[index+1:]
Méthode la plus rapide?
Il y a trois façons. Pour les amateurs de vitesse, je recommande la «méthode 2»
Méthode 1
Donné par cette réponse
Ce qui est assez lent par rapport à la «méthode 2»
Méthode 2 (MÉTHODE RAPIDE)
Donné par cette réponse
Ce qui est beaucoup plus rapide:
Méthode 3:
Tableau d'octets:
la source
timeit.timeit("text = 'abcdefg'; s = bytearray(text); s[1] = 'Z'; str(s)", number=1000000)
deux fois plus lente que la plus rapide.la source
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:
Le
text[1:]
retourne la chaînetext
de la position 1 à la fin, les positions comptent à partir de 0, donc «1» est le deuxième caractère.edit: Vous pouvez utiliser la même technique de découpage de chaîne pour n'importe quelle partie de la chaîne
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
la source
À partir de python 2.6 et python 3, vous pouvez utiliser des sous-tableaux qui sont mutables (peuvent être modifiés par élément contrairement aux chaînes):
edit: str changé en s
edit2: Comme Two-Bit Alchemist l'a mentionné dans les commentaires, ce code ne fonctionne pas avec unicode.
la source
bytearray(s)
, nonbytearray(str)
. D'autre part , cela produira:TypeError: string argument without an encoding
. Si vous spécifiez un encodage, vous obtenezTypeError: an integer is required
. C'est avec Python 3 ou l'unicode de Python 2. Si vous faites cela en Python 2 (avec une deuxième ligne corrigée), cela ne fonctionnera pas pour les caractères non ASCII car ils peuvent ne pas être d'un seul octet. Essayez-le avecs = 'Héllo'
et vous obtiendrez'He\xa9llo'
.s = u'abcdefg'
.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 de python.org, il est possible d'utiliser des ctypes pour modifier la structure des chaînes en mémoire.
Voici un exemple où j'utilise la technique pour effacer une chaîne.
Marquer les données comme sensibles en python
Je le mentionne par souci d'exhaustivité, et cela devrait être votre dernier recours car il est hackish.
la source
str
n'est pas le bon type pour vous. Ne l'utilisez pas. Utilisez quelque chose comme à labytearray
place. (Mieux encore, enveloppez-le dans quelque chose qui vous permet de le traiter plus ou moins comme une donnée opaque afin que vous ne puissiez vraiment pas en récupérer unstr
, pour vous protéger contre les accidents. Il pourrait y avoir une bibliothèque pour cela. Aucune idée.)Ce code n'est pas le mien. Je ne me souvenais pas du formulaire du site où, je l'ai pris. Fait intéressant, vous pouvez l'utiliser pour remplacer un ou plusieurs caractères par un ou plusieurs charectors. Bien que cette réponse soit très tardive, les novices comme moi (à tout moment) pourraient la trouver utile.
Changer la fonction de texte.
la source
l
.mytext = mytext.replace('l', 'W')
->HeWWo Zorld
mytext = mytext.replace('l', 'W',1)
. Lien vers le docEn fait, avec des chaînes, vous pouvez faire quelque chose comme ceci:
Fondamentalement, j'ajoute des "+" chaînes "dans une nouvelle chaîne :).
la source
si votre monde est à 100%
ascii/utf-8
(beaucoup de cas d'utilisation tiennent dans cette case):python 3.7.3
la source
Je voudrais ajouter une autre façon de changer un caractère dans une chaîne.
À quel point est-il plus rapide que de transformer la chaîne en liste et de remplacer la ième valeur, puis de rejoindre à nouveau?.
Approche par liste
Ma solution
la source