0
votes

remplacer une chaîne contenant une sous-chaîne par une chaîne en Python

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.


16 commentaires

essayez - si 'bio' en mot: word = 'biographie'


@SubhrajyotiDas qui mappe bio-pic à biographie plutôt qu'à biographie-pic


ne semble pas bien fonctionner ici ? Que veux-tu dire par là?


@JohnColeman bio-pic serait 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 à biographygraphie


J'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 appeler string.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 -> romcom


Qu'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 :)


4 Réponses :


1
votes

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)


0 commentaires

0
votes
['biography', 'biography', 'biography', 'biography-pic', 'something else', 'biography pic', 'I watched a biography movie']

0 commentaires

0
votes

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 )


0 commentaires

0
votes

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)


0 commentaires