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.