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


160

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

답변:


187

문자열은 변경할 수 없습니다. 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}

3
string.replace()python 3.x에서 더 이상 사용되지 않습니다. 이제str.replace()
Yossarian42

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

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

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


그러나 문자열 세트를 반복 할 때 새로운 세트를 어떻게 업데이트 할 수 있습니까? set_name.update를 사용합니까? 보여줄 수 있습니까?
controlfreak

12

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

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

5

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

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
라인 x.replace('.good',' ')x.replace('.bad',' ')최종 결과에 아무것도하지 않습니다. 인쇄물이 없으면 똑같이 인쇄됩니다.
Srđan Popić

또한 차라리 그냥 한 줄 것 re.sub, 같은 :x = re.sub('((\.good$)|(\.bad$))', '', x)
Srđan Popić

@ SrđanPopić 네 동의합니다
Vivek

그에 따라 편집해야합니까? ( replaces를 제거 하고 모든 re.sub통화 를 한 통화 로 이동 )
Srđan Popić

1
@ SrđanPopić이 답변은 간단하고 현명하기 때문에 게시했습니다.
Vivek

3

나는 테스트를했지만 (귀하의 예제는 아님) 데이터는 순서대로 또는 전체를 반환하지 않습니다.

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

3

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

1

목록 인 경우

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

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

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


0

list에서 무언가를 삭제하면 다음과 같이 사용할 수 있습니다.

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']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.