[python] 파이썬에서 문자열 집합에서 특정 부분 문자열을 제거하는 방법은 무엇입니까?

나는 strings 집합을 가지고 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)원래 대신 사용하려고했지만 아무것도 변경되지 않습니다.



답변

문자열은 변경할 수 없습니다. string.replace(python 2.x) 또는 str.replace(python 3.x)는 문자열을 만듭니다 . 이것은 설명서에 명시되어 있습니다.

모든 하위 문자열 old가 new로 교체 된 string s 사본 을 리턴합니다 . …

이것은 세트를 다시 할당하거나 다시 채워야 함을 의미합니다 ( 세트 이해를 통해 다시 할당하는 것이 더 쉽습니다 ) .

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


답변

>>> x = 'Pear.good'
>>> y = x.replace('.good','')
>>> y
'Pear'
>>> x
'Pear.good'

.replace문자열을 변경 하지 않고 대체와 함께 문자열의 복사본을 반환합니다. 문자열은 변경할 수 없으므로 문자열을 직접 변경할 수 없습니다.

반환 값을 가져 와서 x.replace새 세트에 넣어야합니다.


답변

당신이 필요로하는 것은 약간의 검은 마술입니다!

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


답변

당신은 이것을 할 수 있습니다 :

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


답변

제거 할 하위 문자열이 여러 개인 경우 간단하고 효과적인 옵션 중 하나 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']


답변

목록 인 경우

나는 문자열 집합 인 목록을 위해 무언가를하고 있었고 특정 하위 문자열이있는 모든 줄을 제거하고 싶습니다.

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

여기에 이미지 설명을 입력하십시오