Wie entferne ich bestimmte Teilzeichenfolgen aus einer Reihe von Zeichenfolgen in Python?

160

Ich habe eine Reihe von Zeichenfolgen set1, und alle Zeichenfolgen in set1haben zwei spezifische Teilzeichenfolgen, die ich nicht benötige und entfernen möchte.
Beispiel-Eingabe: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Im Grunde möchte ich, dass die .goodund .badTeilzeichenfolgen aus allen Zeichenfolgen entfernt werden.
Was ich versucht habe:

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

Aber das scheint überhaupt nicht zu funktionieren. Es gibt absolut keine Änderung in der Ausgabe und es ist die gleiche wie die Eingabe. Ich habe versucht, for x in list(set1)anstelle des Originals zu verwenden, aber das ändert nichts.

Kontroll-Freak
quelle

Antworten:

186

Saiten sind unveränderlich. string.replace(Python 2.x) oder str.replace(Python 3.x) erstellt eine neue Zeichenfolge. Dies ist in der Dokumentation angegeben:

Geben Sie eine Kopie der Zeichenfolge s zurück, wobei alle alten Teilzeichenfolgen durch neue ersetzt werden. ...

Dies bedeutet, dass Sie das Set neu zuordnen oder neu füllen müssen (das Neuzuweisen ist mit dem Set-Verständnis einfacher ) :

new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}
Reut Sharabani
quelle
3
string.replace()ist auf Python 3.x veraltet, jetzt ist esstr.replace()
Yossarian42
71
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replacenicht ändert die Zeichenfolge, gibt es eine Kopie der Zeichenfolge mit dem Ersatz. Sie können die Zeichenfolge nicht direkt ändern, da Zeichenfolgen unveränderlich sind.

Sie müssen die Rückgabewerte von übernehmen x.replaceund in einen neuen Satz einfügen.

Alex Hall
quelle
Wie kann ich einen neuen Satz aktualisieren, wenn ich den Satz von Zeichenfolgen durchlaufe? mit set_name.update? Könnten Sie das zeigen?
Kontrollfreak
12

Alles was du brauchst ist ein bisschen schwarze Magie!

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

Sie könnten dies tun:

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)
Vivek
quelle
2
Linie x.replace('.good',' ')und x.replace('.bad',' ')macht nichts mit dem Endergebnis. Der Ausdruck ist ohne sie gleich.
Srđan Popić
Außerdem hätte ich lieber nur eine Zeile mit re.sub:x = re.sub('((\.good$)|(\.bad$))', '', x)
Srđan Popić
@ SrđanPopić ja ich stimme dir zu
Vivek
sollen wir es entsprechend bearbeiten? (Entfernen Sie replaces und verschieben Sie alles auf einen re.subAnruf)
Srđan Popić
1
@ SrđanPopić Ich poste diese Antwort, weil sie einfach und schrittweise ist.
Vivek
3

Ich habe den Test durchgeführt (aber es ist nicht Ihr Beispiel) und die Daten geben sie nicht ordnungsgemäß oder vollständig zurück

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

Ich habe bewiesen, dass dies funktioniert:

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

oder

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

Wenn mehrere Teilzeichenfolgen entfernt werden müssen, besteht eine einfache und effektive Option darin, re.subein kompiliertes Muster zu verwenden, bei dem alle zu entfernenden Teilzeichenfolgen mithilfe der Regex OR ( |) -Pipe verbunden werden.

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']
cs95
quelle
1

Wenn Liste

Ich habe etwas für eine Liste getan, die aus einer Reihe von Zeichenfolgen besteht, und Sie möchten alle Zeilen entfernen, die eine bestimmte Teilzeichenfolge haben. Sie können dies tun

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

Wo subist ein Muster, das Sie nicht in einer Liste von Zeilen haben möchtenLinSplitUnOr

beispielsweise

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

Dann Awird es sein

Geben Sie hier die Bildbeschreibung ein

rsc05
quelle
0

Wenn Sie etwas aus der Liste löschen, können Sie Folgendes verwenden: (Bei der Methode wird zwischen Groß- und Kleinschreibung unterschieden.)

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']
Säugetier
quelle