J'ai besoin de remplacer une chaîne contenant une sous-chaîne par une autre chaîne. Par exemple:
biography -> biography biographical -> biography biopic -> biography bio-pic -> biography-pic I watched a biographical movie -> I watched a biography movie
Ici, tous les mots de gauche contiennent bio , donc le mot entier est remplacé par biographie . Je connais la fonction string.replace () , mais cela ne semble pas bien fonctionner ici. J'ai recherché des expressions régulières, mais je ne suis pas sûr que re soit la bonne bibliothèque pour résoudre le problème.
4 Réponses :
Utilisation de Regex
biography -> biography biography -> biography biography -> biography biography-pic -> biography-pic I watched a biography movie -> I watched a biography movie
Sortie
import re s = """ biography -> biography biographical -> biography biopic -> biography bio-pic -> biography-pic I watched a biographical movie -> I watched a biography movie """ x = re.sub(r'\b(bio\w*)', 'biography', s) print(x)
['biography', 'biography', 'biography', 'biography-pic', 'something else', 'biography pic', 'I watched a biography movie']
Essayez une expression régulière pour résoudre ce problème. Ce sera certainement le cas. Vous pouvez modifier l'expression régulière en fonction de vos besoins. Voici un exemple de code
import re
s = "biography biographical biopic bio-pic I watched a biographical movie"
replaced = re.sub('(bio[A-Za-z]*)', 'biography', s)
print (replaced )
L'une des décisions:
biography -> biography biography -> biography biography -> biography biography-pic -> biography-pic I watched a biography movie -> I watched a biography movie
Résultat:
import re
def f(s, pat, replace):
pat = r'(\w*%s\w*)' % pat
return re.sub(pat, "biography", s)
input = """
biography -> biography
biographical -> biography
biopic -> biography
bio-pic -> biography-pic
I watched a biographical movie -> I watched a biography movie
"""
c = f(input, "bio", "biography")
print(c)
essayez -
si 'bio' en mot: word = 'biographie'@SubhrajyotiDas qui mappe
bio-picàbiographieplutôt qu'àbiographie-picne semble pas bien fonctionner ici? Que veux-tu dire par là?@JohnColeman
bio-picserait un mot sans espaces, je suppose. In vérifierait s'il trouve la sous-chaîne@SukumarRdjf Bonne question, je soupçonne que le problème est qu'il mappe
biographieàbiographygraphieJ'ai édité la question - ajouté un autre exemple. Ce peut être une phrase, pas juste un mot
Commencez par diviser la chaîne en mots, puis appliquez la suggestion de @SubhrajyotiDas à chaque mot.
@ Sukumar-Rdjf Je veux dire que je ne veux pas construire le dictionnaire composé de tous les mots possibles contenant
bio, puis appelerstring.replace (word, bio)pour chaque motÊtes-vous certain de ne pas avoir des éléments comme
'biologie'qui n'ont rien à voir avec la'biographie'mais qui contiennent néanmoins'bio'?Y a-t-il une chance que les mots de votre phrase contiennent des caractères spéciaux autres que
-?@JohnColeman oui, j'en suis certain. J'ai une liste de genres pour les films.
@MichaelButscher Je ne veux pas vraiment faire ça parce que j'ai d'autres remplacements - comme
comédie romantique -> romcomQu'en est-il de cette entrée - "J'ai regardé un film bio avec Martin Rubio", est-ce normal que cela devienne "J'ai regardé un film biographique avec Martin Rubiography"? Sinon, vous devrez peut-être changer l'approche (approche basée sur un dictionnaire, utiliser des outils NLP ou plus). Vous pourriez être surpris de voir à quel point cela peut devenir complexe si vous obtenez le langage naturel comme entrée, pour remplacer "u" par "vous" dans le bon contexte du texte d'argot, j'ai dû entraîner un modèle ML.
@diplodoc Je suis désolé, je veux dire "J'ai regardé un film biographique avec la biographie de Martin" Je ne parle pas d'une liste, mais plutôt de la façon dont vous l'appliquez sur une phrase.
@Maayao J'ai déjà résolu le problème en utilisant l'approche présentée par DarryIG. J'ai dû transformer une liste de genres de films en une forme générale.
@diplodoc Donc, si vous le pouvez, ce sera bien si vous clarifiez la question en éditant la question, en disant que vous voulez transformer une liste - donc cela ne sera pas trompeur pour les personnes qui la liront à l'avenir :)