Bagaimana menghapus substring tertentu dari serangkaian string dengan Python?

160

Saya memiliki serangkaian string set1, dan semua string set1memiliki dua substring khusus yang tidak saya perlukan dan ingin saya hapus.
Contoh Masukan: set1={'Apple.good','Orange.good','Pear.bad','Pear.good','Banana.bad','Potato.bad'}
Jadi pada dasarnya saya ingin .gooddan .badsubstring dihapus dari semua string.
Apa yang saya coba:

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

Tapi ini sepertinya tidak berhasil sama sekali. Sama sekali tidak ada perubahan pada output dan itu sama dengan input. Saya mencoba menggunakan for x in list(set1)bukan yang asli tapi itu tidak mengubah apa pun.

gila kontrol
sumber

Jawaban:

187

String tidak berubah. string.replace(python 2.x) atau str.replace(python 3.x) membuat string baru . Ini dinyatakan dalam dokumentasi:

Kembalikan salinan string s dengan semua kemunculan substring yang lama diganti dengan yang baru. ...

Ini berarti Anda harus mengalokasikan kembali set atau mengisi kembali itu (mengalokasikan lebih mudah dengan pemahaman set) :

new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}
Reut Sharabani
sumber
3
string.replace()sudah ditinggalkan di python 3.x, sekarangstr.replace()
Yossarian42
71
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replacetidak mengubah string, itu mengembalikan salinan string dengan penggantinya. Anda tidak dapat mengubah string secara langsung karena string tidak dapat diubah.

Anda perlu mengambil nilai kembali x.replacedan meletakkannya di set baru.

Alex Hall
sumber
Tetapi ketika saya mengulang set string, bagaimana saya bisa memperbarui set baru? menggunakan set_name.update? Bisakah Anda tunjukkan itu?
controlfreak
12

Yang Anda butuhkan hanyalah sedikit ilmu hitam!

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

Anda bisa melakukan ini:

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
sumber
2
line x.replace('.good',' ')dan x.replace('.bad',' ')tidak melakukan apa pun untuk hasil akhir. Hasil cetak akan sama tanpa mereka.
Srđan Popić
Juga saya lebih suka hanya memiliki satu baris dengan re.sub, seperti ini:x = re.sub('((\.good$)|(\.bad$))', '', x)
Srđan Popić
@ SrđanPopić ya saya setuju dengan Anda
Vivek
haruskah kita mengeditnya sesuai? (hapus replaces dan pindahkan semuanya ke satu re.subpanggilan)
Srđan Popić
1
@ SrđanPopić Saya memposting jawaban ini karena sederhana dan langkah bijak.
Vivek
3

Saya telah melakukan tes (tetapi ini bukan contoh Anda) dan data tidak mengembalikannya dengan tertib atau lengkap

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

Saya membuktikan bahwa ini berhasil:

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

atau

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

Ketika ada beberapa substring untuk dihapus, satu opsi sederhana dan efektif adalah untuk menggunakan re.subdengan pola terkompilasi yang melibatkan menggabungkan semua substring-untuk menghapus menggunakan |pipa 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']
cs95
sumber
1

Jika daftar

Saya sedang melakukan sesuatu untuk daftar yang merupakan serangkaian string dan Anda ingin menghapus semua baris yang memiliki substring tertentu yang dapat Anda lakukan ini

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

di mana subderai yang tidak ingin Anda miliki dalam daftar garisLinSplitUnOr

sebagai contoh

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

Maka Aakan menjadi

masukkan deskripsi gambar di sini

rsc05
sumber
0

jika Anda menghapus sesuatu dari daftar, Anda dapat menggunakan cara ini: (sub metode peka huruf besar-kecil)

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