Comment remplacer les occurrences d'un caractère avec une seule instance de ce personnage en python
Je veux remplacer les instances répétées de la "*"
caractère dans une chaîne, avec une seule instance de "*"
. Par exemple, si la chaîne est "***abc**de*fg******h"
, je veux qu'il se converti à "*abc*de*fg*h"
.
Je suis assez nouveau à python (et de la programmation en général) et essayé d'utiliser des expressions régulières et de la corde.replace() comme:
import re
pattern = "***abc**de*fg******h"
pattern.replace("*"\*, "*")
où \*
est censé remplacer toutes les occurrences du caractère"*". Mais j'ai eu: SyntaxError: unexpected caractère après caractère de continuation de ligne.
J'ai aussi essayé de le manipuler avec une boucle for comme:
def convertString(pattern):
for i in range(len(pattern)-1):
if(pattern[i] == pattern[i+1]):
pattern2 = pattern[i]
return pattern2
mais cela a l'erreur où il imprime seulement les "*" les car pattern2 = pattern[i] constamment redéfinit ce qu'pattern2 est...
Toute aide serait appréciée.
OriginalL'auteur NSchrading | 2010-10-07
Vous devez vous connecter pour publier un commentaire.
Le naïf façon de faire ce genre de chose avec
re
estQui remplace les pistes de 1 ou plusieurs astérisques avec un astérisque. Pour les courses de exactement un astérisque, qui est en cours d'exécution très dur juste pour rester immobile. Beaucoup mieux est de remplacer les pistes de deux ou plus de DEUX astérisques par un astérisque:
Cela peut être bien la peine de le faire:
Noter que les ré.sous renverra une référence à la chaîne d'entrée, si elle n'a pas trouvé de correspondances, d'économiser plus de l'usure sur votre ordinateur, au lieu d'une toute nouvelle chaîne.
Pas sûr au sujet de la lisibilité ... une fois JAvg comprend
\X
, le saut à\X\X
semble minuscule à moi. Peut-être\X{2,}
serait mieux? J'espère que JAvg ne rien faire à l'aveuglette. Si la sortie exigence changé à "trouver toutes les occurrences de la répétition des astérisques", vous me plais à penser que l'expression rationnelle a été changé à partir de 1+ à 2+.OriginalL'auteur John Machin
un non regex façon
OriginalL'auteur ghostdog74
Je suggérerais à l'aide de la module re sous-fonction:
Je recommande fortement la lecture par le biais de l'article à propos de RE et de bonnes pratiques. Ils peuvent être difficile si vous n'êtes pas familier avec eux. Dans la pratique, à l'aide de matières de chaînes de caractères est une bonne idée.
Dans
"\\*+"
, je suis d'échapper le caractère * parce que c'est une re symbole. J'ai donc correspondre à un littéral caractère*, et le + signifie un ou plusieurs.OriginalL'auteur JoshD
Vous avez écrit:
Vous dire:
Vous vraiment que cela signifiait:
qui fait ce que vous vouliez.
OriginalL'auteur tzot
Bien les expressions régulières sage, je ferais exactement comme JoshD a suggéré. Mais une amélioration ici.
Utilisation -
Ce serait essentiellement le cache de votre regex. Donc d'un usage ultérieur de cette dans une boucle rendrait votre regex opérations rapides.
OriginalL'auteur Srikar Appalaraju
Qui va le faire.
OriginalL'auteur Ruel
sans regexp vous pouvez utiliser générale de répéter l'élément de retrait avec vérification des '*':
OriginalL'auteur Tony Veijalainen
Permet de supposer dans ce but de cet exemple, votre personnage est un espace.
Vous pouvez également le faire de cette façon:
Ce:
Devient:
Je trouve que c'est un peu plus facile que d'avoir à nettoyer avec le module re, qui peut devenir un peu ennuyeux parfois (je pense).
De l'espoir qui a été utile.
OriginalL'auteur copeland3300
Cela fonctionne pour n'importe quel nombre de tentatives d'astérisques, bien que vous devrez peut-être remplacer ce caractère par une autre chaîne que vous savez être unique tout au long de la chaîne.
Je crois regex approches sont généralement plus gourmand en ressources que cela.
OriginalL'auteur Brian from Chicago
J'ai chronométré toutes les méthodes dans le courant des réponses (avec Python 3.7.2, macOS High Sierra).
b()
était le meilleur dans l'ensemble,c()
était meilleur lorsqu'aucune correspondance n'est fait.Entrée 1, pas de répétitions:
'a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*'
Entrée 2, avec des répétitions:
'a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*****************************************************************************************************a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*'
Les méthodes:
OriginalL'auteur Hugo