2017-10-14 3 views
1

Mon programme consiste à vérifier si la phrase d'entrée contient not suivi de bad et de le remplacer par good. Par exemple, si la phrase contenue not bad sans aucune autre chaîne entre not et bad, j'ai pu les remplacer par good comme indiqué dans le code ci-dessous:Vérifiez si certaines chaînes sont présentes dans une phrase et remplacez-les par une autre chaîne en utilisant Python 3.6

s = 'The day is not bad' 
s = s.replace('not bad', 'good') 
print(s) 

et la sortie était:

>>> The day is good 

Le problème se pose lorsqu'il existe un autre mot (ou mots) entre not et bad. Jetez un oeil aux codes j'ai essayé:

l = ['not', 'bad'] 
s = 'The day is not so bad' 
if l in s: 
    s = s.replace(l,'good') 

Il THROWED une erreur comme suit lorsque le résultat attendu doit être The day is good:

Traceback (most recent call last): 

    File "<ipython-input-69-0eb430659d1e>", line 3, in <module> 
    if l in s: 

TypeError: 'in <string>' requires string as left operand, not list 

J'ai essayé quelque chose comme ça aussi:

list_ = ['not', 'bad'] 
if any(word in 'The day is not at all bad' for word in list_): 
s = s.replace(s,'good') 

Mais la sortie de errorsome que j'ai eu pour le code ci-dessus était:

>>> s 
>>> good 

OIEau, la phrase entière a été remplacé par good. Pouvez-vous suggérer ce qu'il faut faire si je devrais obtenir quelque chose comme celui ci-dessous:

>>> s = 'The day is not at all bad' #input 

>>> print(output) 
>>> 'The day is good' # the desired output 
+1

Enfin, je suis ce que vous voulez, je l'ai mis à jour ma réponse, s'il vous plaît vérifier. –

Répondre

1

Il y a deux façons dont vous pouvez aborder ce sujet. Une façon est de convertir la phrase en une liste de mots, de localiser "not" et "bad" dans la liste, de les supprimer et de tous les éléments entre et d'insérer "good".

>>> s = 'the day is not at all bad' 
>>> start, stop = 'not', 'bad' 
>>> words = s.split() 
>>> words 
['the', 'day', 'is', 'not', 'at', 'all', 'bad'] 
>>> words.index(start) 
3 
>>> words.index(stop) 
6 
>>> del words[3:7] # add 1 to stop index to delete "bad" 
>>> words 
['the', 'day', 'is'] 
>>> words.insert(3, 'good') 
>>> words 
['the', 'day', 'is', 'good'] 
>>> output = ' '.join(words) 
>>> print(output) 
the day is good 

Une autre méthode consiste à utiliser regular expressions pour trouver un modèle qui correspond à « non » suivi par zéro ou plusieurs mots, suivi de « mauvais ». La fonction re.sub trouve des chaînes qui correspondent à un modèle et les remplace par une chaîne donnée que vous fournissez:

>>> import re 
>>> pattern = r'not\w+bad' 
>>> re.search(pattern, s) 
>>> pattern = r'not(\s+\w+)* bad' # pattern matches "not <words> bad" 
>>> re.sub(pattern, 'good', s) 
'the day is good' 
2
import re 
s = 'The day is at not all bad' 
pattern=r'(not)(?(1).+(bad))' 

match=re.search(pattern,s) 

new_string=re.sub(pattern,"good",s) 

print(new_string) 

sortie:

The day is at good 

explication Regex:

je if else condition regex ici:

Comment if else dans les travaux regex, ce bien est très simple si la syntaxe regex autre:

(condition1)(?(1)(do something else)) 
(?(A)X|Y) 

Cela signifie « si la proposition A est vrai, correspond alors modèle X; sinon, le motif correspondance Y. »

donc dans cette regex:

(not)(?(1).+(bad)) 

il correspond à « mauvais » si « pas » dans la chaîne, la condition est « non » doit présenter dans la chaîne.

Deuxième Regex:

si vous voulez, vous pouvez également utiliser cette regex:

(not.+)(bad) 

Dans ce groupe (2) correspondant à 'mauvais'.

Votre chaîne:

>>> s = 'The day is not at all bad' #input 

>>> print(output) 
>>> 'The day is good' # output 
+0

Vous ne savez pas comment cela s'adresse à la recherche du mot "mauvais" * après * le mot "pas" ... Aussi, pour votre exemple de dict, pourquoi vérifiez-vous que la chaîne est présente avant de la remplacer? Essayez de le remplacer et s'il n'est pas présent, il ne se passera rien ... Il ne sert à rien de scanner deux fois ... –