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

Posted

技术标签:

【中文标题】如何从 Python 中的一组字符串中删除特定的子字符串?【英文标题】:How to remove specific substrings from a set of strings in Python? 【发布时间】:2016-09-19 05:58:03 【问题描述】:

我有一组字符串set1set1 中的所有字符串都有两个特定的子字符串,我不需要并且想要删除它们。 样本输入: 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','')

但这似乎根本不起作用。输出绝对没有变化,它与输入相同。我尝试使用for x in list(set1) 而不是原来的那个,但这并没有改变任何东西。

【问题讨论】:

【参考方案1】:
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replace 不会更改字符串,它会返回带有替换的字符串副本。您不能直接更改字符串,因为字符串是不可变的。

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

【讨论】:

但是当我遍历这组字符串时,如何更新一个新的集合?使用 set_name.update?你能证明一下吗?【参考方案2】:

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

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

返回字符串的副本,其中所有出现的子字符串old 都替换为new。 [...]

这意味着您必须重新分配集合或重新填充它(使用set comprehension) 重新分配更容易:

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

【讨论】:

注意:它也适用于列表,只需使用[...]而不是...【参考方案3】:

你可以这样做:

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)

【讨论】:

line x.replace('.good',' ')x.replace('.bad',' ') 对最终结果没有任何作用。没有它们,打印出来的结果是一样的。 另外我宁愿只写一行re.sub,像这样:x = re.sub('((\.good$)|(\.bad$))', '', x) @SrđanPopić 是的,我同意你的看法 @SrđanPopić 我发布这个答案是因为它很简单,而且是明智的。 在 Python 字符串中是不可变的。 str.replace(old, new) 返回字符串的副本,其中所有出现的子字符串 'old' 都替换为 'new'。它的结果必须分配给一个新变量。就像在接受的答案中解释的那样:***.com/a/37372690/2690353【参考方案4】:

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

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

【讨论】:

【参考方案5】:

如果列表

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

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就会是

【讨论】:

在 Python 中,函数和变量的名称是 loweraces_with_underscores 而不是 CapitalCase【参考方案6】:

你只需要一点黑魔法!

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

【讨论】:

【参考方案7】:

当有多个要删除的子字符串时,一个简单而有效的选择是将 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']

【讨论】:

【参考方案8】:

Python 3.9+ 中,您可以使用 str.removesuffix('mysuffix') 删除后缀。来自the docs:

如果字符串以 suffix 字符串结尾并且 suffix 不为空,则返回 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"))

或者使用集合推导创建新集合:

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

输出:

'Orange', 'Pear', 'Apple', 'Banana', 'Potato'

【讨论】:

【参考方案9】:
# practices 2
str = "Amin Is A Good Programmer"
new_set = str.replace('Good', '')
print(new_set)

 

print : Amin Is A  Programmer

【讨论】:

嗨,阿敏。虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 How to Answer。亲切的问候。 嗨,我的朋友,此代码适用于其他长文本。所以即使你可以从输入中获取你的字符串并找到文本点... 重命名像str这样的内置函数是非常糟糕的做法。 那不是一个集合。 为什么没有设置,但我知道这是真的。那么你在这段代码中的问题是什么。

以上是关于如何从 Python 中的一组字符串中删除特定的子字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQLite 数据库中的用户位置检索特定范围内的一组位置

从 Python 数据框的一列中的每一行中删除前 x 个字符

在Python中的特定字符之后删除部分字符串

Python - 从大量组合中构建满足某些标准的子列表

如何从 C++ 中的 getline 函数中提取特定的子字符串?

替换出现在两个特定单词之间的一组字符串的所有出现