Как удалить определенные подстроки из набора строк в Python?
У меня есть набор строк set1
, и все строки в set1
имеют две конкретные подстроки, которые мне не нужны и которые нужно удалить.
Пример ввода:
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
Строки неизменяемы. string.replace
создает строку new. Это указано в документации:
Вернуть копию строки s со всеми вхождениями подстроки, замененной на новую....
Это означает, что вам нужно повторно назначить набор или повторно заполнить его (перераспределение проще с установить понимание):
new_set = {x.replace('.good', '').replace('.bad', '') for x in set1}
Ответ 2
>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'
.replace
не меняет строку, он возвращает копию строки с заменой. Вы не можете изменить строку напрямую, потому что строки неизменяемы.
Вам нужно взять возвращаемые значения из x.replace
и поместить их в новый набор.
Ответ 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)
Ответ 4
Все, что вам нужно, это немного черной магии!
>>> a = ["cherry.bad","pear.good", "apple.good"]
>>> a = list(map(lambda x: x.replace('.good','').replace('.bad',''),a))
>>> a
['cherry', 'pear', 'apple']
Ответ 5
Я сделал тест (но это не ваш пример), и данные не возвращают их упорядоченным или полным
>>> 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']
Ответ 6
Когда нужно удалить несколько подстрок, одним простым и эффективным вариантом является использование 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']
Ответ 7
Если список
Я делал что-то для списка, который представляет собой набор строк, и вы хотите удалить все строки, которые имеют определенную подстроку, вы можете сделать это
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]()