Mam zestaw ciągów set1
, a wszystkie z nich set1
mają dwa określone podciągi, których nie potrzebuję i chcę usunąć.
Przykładowe dane wejściowe:
set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Więc w zasadzie chcę usunąć podciągi .good
i .bad
ze wszystkich ciągów.
Co próbowałem:
for x in set1:
x.replace('.good','')
x.replace('.bad','')
Ale to w ogóle nie działa. Nie ma absolutnie żadnej zmiany na wyjściu i jest to to samo, co wejście. Próbowałem użyć for x in list(set1)
zamiast oryginalnego, ale to niczego nie zmienia.
źródło
string.replace()
jest przestarzałe w Pythonie 3.x, teraz jeststr.replace()
.replace
nie zmienia ciągu, zwraca kopię ciągu z zamiennikiem. Nie możesz zmienić ciągu bezpośrednio, ponieważ są one niezmienne.Musisz pobrać wartości zwracane z
x.replace
i umieścić je w nowym zestawie.źródło
Wystarczy odrobina czarnej magii!
źródło
Możesz to zrobić:
źródło
x.replace('.good',' ')
ix.replace('.bad',' ')
nie wpływa na efekt końcowy. Wydruk będzie taki sam bez nich.re.sub
, taką jak ta:x = re.sub('((\.good$)|(\.bad$))', '', x)
replace
si i przenieś wszystko do jednejre.sub
rozmowy)Zrobiłem test (ale to nie jest twój przykład) i dane nie zwracają ich uporządkowanych lub kompletnych
Udowodniłem, że to działa:
lub
źródło
Gdy istnieje wiele podciągów do usunięcia, jedną prostą i skuteczną opcją jest użycie
re.sub
skompilowanego wzorca, który obejmuje połączenie wszystkich podciągów w celu usunięcia za pomocą|
potoku wyrażenia regularnego OR ( ).źródło
Jeśli lista
Robiłem coś dla listy będącej zbiorem ciągów i chcesz usunąćwszystkie linie które mają określony podciąg możesz to zrobić
gdzie
sub
jest wzór, którego nie chcesz mieć na liście liniiLinSplitUnOr
na przykład
Wtedy
A
będzieźródło
jeśli usuniesz coś z listy, możesz użyć tego sposobu: (metoda sub rozróżnia wielkość liter)
źródło