J'ai un ensemble de chaînes set1
, et toutes les chaînes de set1
ont deux sous-chaînes spécifiques que je n'ai pas besoin et que je veux supprimer.
Exemple d'entrée: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Je souhaite donc que les sous-chaînes .good
et .bad
soient supprimées de toutes les chaînes.
Ce que j'ai essayé:
for x in set1:
x.replace('.good','')
x.replace('.bad','')
Mais cela ne semble pas fonctionner du tout. Il n'y a absolument aucun changement dans la sortie et c'est la même chose que l'entrée. J'ai essayé d'utiliser for x in list(set1)
au lieu de l'original, mais cela ne change rien.
Les cordes sont immuables. string.replace
crée une nouvelle chaîne . Ceci est indiqué dans la documentation:
Renvoie une copie de la chaîne s en remplaçant toutes les occurrences de la sous-chaîne par new. ...
Cela signifie que vous devez réaffecter le jeu ou le re-peupler (réallouer est plus facile avec compréhension du jeu) :
_new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}
_
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'
.replace
ne fait pas change la chaîne, il renvoie une copie de la chaîne avec le remplacement. Vous ne pouvez pas changer la chaîne directement car les chaînes sont immuables.
Vous devez prendre les valeurs de retour de x.replace
et les placer dans un nouvel ensemble.
Tout ce dont vous avez besoin, c'est d'un peu de magie noire!
>>> a = ["cherry.bad","pear.good", "Apple.good"]
>>> a = list(map(lambda x: x.replace('.good','').replace('.bad',''),a))
>>> a
['cherry', 'pear', 'Apple']
Vous pourriez faire ceci:
import re
import string
set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
for x in set1:
x.replace('.good',' ')
x.replace('.bad',' ')
x = re.sub('\.good$', '', x)
x = re.sub('\.bad$', '', x)
print(x)
J'ai fait le test (mais ce n'est pas votre exemple) et les données ne les renvoient pas correctement ni complètement.
>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = {x.replace('p','') for x in ind}
>>> newind
{'1', '2', '8', '5', '4'}
J'ai prouvé que cela fonctionne:
>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = [x.replace('p','') for x in ind]
>>> newind
['5', '1', '8', '4', '2', '8']
ou
>>> newind = []
>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> for x in ind:
... newind.append(x.replace('p',''))
>>> newind
['5', '1', '8', '4', '2', '8']
Je faisais quelque chose pour une liste qui est un ensemble de chaînes et vous voulez supprimer toutes les lignes qui ont une certaine sous-chaîne, vous pouvez le faire
import re
def RemoveInList(sub,LinSplitUnOr):
indices = [i for i, x in enumerate(LinSplitUnOr) if re.search(sub, x)]
A = [i for j, i in enumerate(LinSplitUnOr) if j not in indices]
return A
où sub
est un motif que vous ne souhaitez pas inclure dans une liste de lignes LinSplitUnOr
par exemple
A=['Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad']
sub = 'good'
A=RemoveInList(sub,A)
Alors A
sera
Lorsque plusieurs sous-chaînes doivent être supprimées, une option simple et efficace consiste à utiliser re.sub
avec un motif compilé impliquant la jonction de toutes les sous-chaînes à supprimer à l'aide de l'expression régulière OR (|
) pipe.
import re
to_remove = ['.good', '.bad']
strings = ['Apple.good','Orange.good','Pear.bad']
p = re.compile('|'.join(map(re.escape, to_remove))) # escape to handle metachars
[p.sub('', s) for s in strings]
# ['Apple', 'Orange', 'Pear']