如何在Python中从一组字符串中删除特定的子字符串?

我有一组字符串,所有的字符串都有两个特定的子字符串之一,我想删除:

set1 = {'Apple.good', 'Orange.good', 'Pear.bad', 'Pear.good', 'Banana.bad', 'Potato.bad'}

我想要&;.good"和“;.bad"从所有字符串中删除子字符串。我试了一下:

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

但它似乎不工作,set1保持完全相同。我尝试使用for x in list(set1)代替,但这并没有改变任何东西。

650202 次浏览
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replace不会改变字符串,它返回一个替换后的字符串副本。你不能直接改变字符串,因为字符串是不可变的。

你需要从x.replace中获取返回值,并将它们放入一个新的集合中。

字符串是不可变的。str.replace创建一个字符串。这在文档中有说明:

str.replace(old, new[, count])

返回字符串的复制,将所有出现的子字符串替换为。[…]

这意味着你必须重新分配集合或重新填充它(使用设置的理解重新分配更容易):

new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}

附注:如果你想改变字符串的前缀或后缀,并且你正在使用Python 3.9或更新的字符串,请使用str.removeprefix()str.removesuffix()代替:

new_set = {x.removesuffix('.good').removesuffix('.bad') for x in set1}

你可以这样做:

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)

我做了测试(但这不是你的例子),数据并没有有序或完整地返回它们

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

我证明了这是可行的:

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

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

如果列表

我正在为一个列表做一些事情,它是一组字符串,你想删除所有有特定子字符串的行,你可以这样做

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

其中sub是一个你不希望在LinSplitUnOr

例如

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

那么A将是

enter image description here

你所需要的只是一点黑魔法!

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

当有多个子字符串要删除时,一个简单而有效的选项是使用re.sub和一个已编译的模式,其中包括使用正则表达式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']

Python 3.9+中,可以使用str.removesuffix('mysuffix')删除后缀。从的文档:

如果字符串以后缀结尾,并且后缀不为空,则返回string[:-len(suffix)]。否则,返回原始字符串的副本

因此,你可以创建一个新的空集,并添加每个不带后缀的元素:

set1  = {'Apple.good', 'Orange.good', 'Pear.bad', 'Pear.good', 'Banana.bad', 'Potato.bad'}


set2 = set()
for s in set1:
set2.add(s.removesuffix(".good").removesuffix(".bad"))

或者使用set comprehension创建新的set:

set2 = {s.removesuffix(".good").removesuffix(".bad") for s in set1}
   

print(set2)

输出:

{'Orange', 'Pear', 'Apple', 'Banana', 'Potato'}
# practices 2
str = "Amin Is A Good Programmer"
new_set = str.replace('Good', '')
print(new_set)


 



print : Amin Is A  Programmer