Remplacer toutes les occurrences de certains mots
Supposons que j'ai la phrase suivante:
bean likes to sell his beans
et je veux remplacer toutes les occurrences de certains mots par d'autres mots. Par exemple, bean
à robert
et beans
à cars
.
Je ne peut pas utiliser de str.replace
parce que dans ce cas ça va changer la beans
à roberts
.
>>> "bean likes to sell his beans".replace("bean","robert")
'robert likes to sell his roberts'
J'ai besoin de changer les mots entiers uniquement, pas les occurrences du mot dans l'autre mot. Je pense que je peux y parvenir en utilisant des expressions régulières, mais ne savent pas comment le faire correctement.
vous pourriez
split()
le texte en mots de la premièreOriginalL'auteur FrozenHeart | 2014-09-02
Vous devez vous connecter pour publier un commentaire.
Si vous utiliser des regex, vous pouvez spécifier les limites de mot avec
\b
:Ici "haricots" n'est pas modifiée (la "roberts"), car les " s " à la fin n'est pas une frontière entre les mots:
\b
correspond à la chaîne vide, mais seulement au début ou à la fin d'un mot.La deuxième remplacement complet:
Je suppose que les parenthèses ne sont pas nécessaires, ils ont juste fait la regex plus lisible (au moins pour moi).
Pour une raison quelconque, cela ne semble pas pour obtenir tous occurrence des états-UNIS
OriginalL'auteur Alex Riley
Si vous remplacez chaque mot un à un, vous pouvez remplacer les mots plusieurs fois (et de ne pas obtenir ce que vous voulez). Pour éviter cela, vous pouvez utiliser une fonction ou lambda:
De cette façon, une fois
bean
est remplacé parrobert
, il ne sera pas modifié à nouveau (même sirobert
est également dans votre liste d'entrée de mots).Comme suggéré par georg, j'ai édité cette réponse avec
dict.get(key, default_value)
.Solution Alternative (également suggéré par georg):
if
directement regarder dans le dict si vous utilisez\bbeans?\b
pour les regex et l'utilisationm.group(0)
(pour l'ensemble du match) dans le lambda.Je voudrais être assez générale, donc 1 regex peut faire face à n'importe quelle entrée de texte + une liste de mots à remplacer. Donc je ne veux pas
beans
dans ma regex.Je vois. C'est juste qu'il va vérifier chaque mot et je crois que c'est le principal goulot d'étranglement.
Je suis d'accord, il devrait être plus rapide à coder en dur 1 regex par mot pour le remplacer. Mais il y a toujours le problème de faire en sorte que, une fois remplacé, un mot n'est pas remplacé à nouveau par une autre expression régulière.
Non, le problème n'est plus un problème.
\bbeans?\b
correspond à la fois àbean
etbeans
de sorte que ce que vous obtenez dans le lambda estd['bean']
etd['beans']
et les deux sont donc traités différemment.OriginalL'auteur nicolas
Va remplacer toutes les occurrences de "haricots" avec "cars" et "bean" avec "robert". Cela fonctionne parce que
.replace()
renvoie une modification de l'instance de la chaîne d'origine. En tant que tel, vous pouvez penser à elle dans les stades. Fondamentalement, il fonctionne de cette façon:OriginalL'auteur Kevin London
Je sais que sa fait longtemps mais Ne ce look beaucoup plus élégant? :
OriginalL'auteur Akshay Hazari