Comment remplacer la première occurrence d'un caractère dans chaque mot?
Disons que j'ai cette chaîne:
hello @jon i am @@here or @@@there and want some@thing in '@here"
# ^ ^^ ^^^ ^ ^
Et je veux supprimer le premier @
de chaque mot, pour finir par avoir une chaîne finale comme celle-ci:
hello jon i am @here or @@there and want something in 'here
# ^ ^ ^^ ^ ^
Pour plus de précision, les caractères "@" apparaissent toujours ensemble dans chaque mot, mais peuvent être au début du mot ou entre d'autres caractères.
J'ai réussi à supprimer le caractère "@" s'il se produit une seule fois en utilisant une variation de l'expression régulière que j'ai trouvée dans la sous-chaîne Supprimer quand il se produit une fois, mais pas deux fois de suite en python , qui utilise un lookahead négatif et un lookbehind négatif:
@(?!@)(?<!@@)
Voir la sortie:
>>> s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
>>> re.sub(r'@(?!@)(?<!@@)', '', s)
"hello jon i am @@here or @@@there and want something in 'here"
La prochaine étape consiste donc à remplacer le "@" lorsqu'il se produit plusieurs fois. Ceci est facile en s.replace('@@', '@')
supprimant le "@" partout où il se reproduit.
Cependant, je me demande: existe-t-il un moyen de faire ce remplacement en une seule fois?
@Hello@There
où@
ne serait pas consécutive?Réponses:
Je ferais un remplacement regex sur le modèle suivant:
Et puis remplacez simplement par le premier groupe de capture, qui est tous des symboles @ continus, moins un.
Cela devrait capturer chaque
@
occurrence au début de chaque mot, que ce soit au début, au milieu ou à la fin de la chaîne.Cela imprime:
la source
Que diriez-vous d'utiliser
replace('@', '', 1)
dans une expression de générateur?La valeur int de
1
est l'count
argument facultatif .str.replace(old, new[, count])
la source
replace(search, replace, max_matches)
, il remplace simplement le premier sur chaque mot.count
, j'ai ajouté la description des docs.Vous pouvez utiliser
re.sub
comme ceci:Cela se traduira par:
Et voici une preuve de concept:
la source
Était en train de réfléchir aux cas si seulement le dernier caractère était
@
et que vous ne vouliez pas le supprimer, ou si vous aviez des caractères de démarrage autorisés spécifiques, est venu avec ceci:Ou, supposons que vous ne souhaitiez remplacer
@
que s'il est composé des n premiers caractèresla source
DEMO
Vous pouvez essayer ça. Voir la démo.
la source
Production:
la source