Come rimuovere specifiche sottostringhe da una serie di stringhe in Python?


160

Ho un set di stringhe set1e tutte le stringhe set1hanno due sottostringhe specifiche che non mi servono e che voglio rimuovere.
Ingresso campione: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Quindi, fondamentalmente voglio il .goode .badsottostringhe rimosso da tutte le stringhe.
Cosa ho provato:

for x in set1:
    x.replace('.good','')
    x.replace('.bad','')

Ma questo non sembra funzionare affatto. Non vi è assolutamente alcun cambiamento nell'output ed è uguale all'input. Ho provato a utilizzare al for x in list(set1)posto di quello originale ma questo non cambia nulla.

Risposte:


187

Le stringhe sono immutabili. string.replace(python 2.x) o str.replace(python 3.x) crea una nuova stringa. Questo è indicato nella documentazione:

Restituisce una copia della stringa s con tutte le occorrenze della sottostringa vecchie sostituite da nuove. ...

Ciò significa che devi riassegnare l'insieme o ripopolarlo (riassegnare è più facile con la comprensione dell'insieme) :

new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}

3
string.replace()è deprecato su Python 3.x, ora lo èstr.replace()
Yossarian42

71
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replacenon cambia la stringa, restituisce una copia della stringa con la sostituzione. Non puoi cambiare direttamente la stringa perché le stringhe sono immutabili.

Devi prendere i valori di ritorno da x.replacee metterli in un nuovo set.


Ma quando eseguo il ciclo sul set di stringhe, come posso aggiornare un nuovo set? utilizzando set_name.update? Potresti mostrarlo?
controlfreak

12

Tutto ciò che serve è un po 'di magia nera!

>>> a = ["cherry.bad","pear.good", "apple.good"]
>>> a = list(map(lambda x: x.replace('.good','').replace('.bad',''),a))
>>> a
['cherry', 'pear', 'apple']

5

Potresti farlo:

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)

2
linea x.replace('.good',' ')e x.replace('.bad',' ')non fa nulla per il risultato finale. La stampa sarà la stessa senza di loro.
Srđan Popić,

Inoltre preferirei avere solo una riga con re.sub, in questo modo:x = re.sub('((\.good$)|(\.bad$))', '', x)
Srđan Popić,

@ SrđanPopić sì, sono d'accordo con te
Vivek,

dovremmo modificarlo di conseguenza? (rimuovi se replacesposta tutto in una re.subchiamata)
Srđan Popić il

1
@ SrđanPopić Inserisco questa risposta perché è semplice e saggia.
Vivek,

3

Ho fatto il test (ma non è il tuo esempio) e i dati non li restituiscono ordinati o completi

>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = {x.replace('p','') for x in ind}
>>> newind
{'1', '2', '8', '5', '4'}

Ho dimostrato che funziona:

>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> newind = [x.replace('p','') for x in ind]
>>> newind
['5', '1', '8', '4', '2', '8']

o

>>> newind = []
>>> ind = ['p5','p1','p8','p4','p2','p8']
>>> for x in ind:
...     newind.append(x.replace('p',''))
>>> newind
['5', '1', '8', '4', '2', '8']

3

Quando ci sono più sottostringhe da rimuovere, un'opzione semplice ed efficace è quella di utilizzare re.subun modello compilato che prevede l'unione di tutte le sottostringhe da rimuovere usando il |tubo regex OR ( ).

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']

1

Se elenco

Stavo facendo qualcosa per un elenco che è un insieme di stringhe e vuoi rimuovere tutte le linee che hanno una determinata sottostringa che puoi fare

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

dove subè uno scalpiccio che non si desidera avere in un elenco di righeLinSplitUnOr

per esempio

A=['Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad']
sub = 'good'
A=RemoveInList(sub,A)

Allora Alo sarà

inserisci qui la descrizione dell'immagine


0

se elimini qualcosa dall'elenco, puoi usare in questo modo: (il metodo sub fa distinzione tra maiuscole e minuscole)

new_list = []
old_list= ["ABCDEFG","HKLMNOP","QRSTUV"]

for data in old_list:
     new_list.append(re.sub("AB|M|TV", " ", data))

print(new_list) // output : [' CDEFG', 'HKL NOP', 'QRSTUV']
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.