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.

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}

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.


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

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)

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

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

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


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']
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.