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.

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}

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.


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

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)

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

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

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


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']
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.