파이썬에서 문자열에서 특정 문자 제거 영향을 미치지

파이썬을 사용하여 문자열에서 특정 문자를 제거하려고합니다. 이것은 지금 사용중인 코드입니다. 불행히도 문자열에는 아무런 영향을 미치지 않는 것으로 보입니다.

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

이 작업을 올바르게 수행하려면 어떻게합니까?



답변

파이썬의 문자열은 변경할 수 없습니다 ( 변경 불가 ). 이로 인해 line.replace(...)기존 문자열을 변경하지 않고 새 문자열을 만드는 것이 효과입니다 . 당신은 할 필요가 리 바인드 로 (할당)을 line그 변수를 제거하는 문자로, 새로운 값을 갖기 위해.

또한, 당신이하고있는 방식은 상대적으로 느리게 진행됩니다. 또한 경험이 많은 pythonator에게는 약간 혼동 될 수 있습니다. 경험이 많은 pythonator는 이중 중첩 구조를보고 더 복잡한 무언가가 진행되고 있다고 생각합니다.

Python 2.6 및 최신 Python 2.x 버전 *부터는 대신을 사용할 수 있습니다 str.translate(하지만 Python 3 차이점에 대해서는 계속 읽으십시오).

line = line.translate(None, '!@#$')

또는 정규식 대체 re.sub

import re
line = re.sub('[!@#$]', '', line)

대괄호로 묶인 문자는 문자 클래스를 구성합니다 . line해당 클래스 에 있는 모든 문자 는 두 번째 매개 변수로 대체됩니다 sub. 빈 문자열.

Python 3에서 문자열은 유니 코드입니다. 약간 다르게 번역해야합니다. kevpie는 답변 중 하나 에 대한 의견 에서 이것을 언급했으며에 대한 설명서에 나와str.translate 있습니다.

translate유니 코드 문자열 의 메소드를 호출 할 때 위에서 사용한 두 번째 매개 변수를 전달할 수 없습니다. None첫 번째 매개 변수로 전달할 수도 없습니다 . 대신 번역 테이블 (일반적으로 사전)을 유일한 매개 변수로 전달합니다. 이 표 는 문자 의 서수 값 (즉, 호출 한 결과 ord)을 해당 문자 의 서수 값 에 매핑합니다.이 서수 는 문자를 None삭제해야 함을 나타냅니다.

유니 코드 문자열로 위의 춤을 수행하려면 다음과 같이 호출하십시오.

translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)

여기 dict.fromkeys하고 map간결 포함하는 사전을 생성하는 데 사용되는

{ord('!'): None, ord('@'): None, ...}

더 간단한 방법으로 다른 답변에 따르면 번역 테이블을 작성하십시오.

unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})

또는 다음을 사용하여 동일한 번역 테이블을 만듭니다 str.maketrans.

unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))

* 이전 파이썬과의 호환성을 위해 다음 대신에 “널”변환 테이블을 작성할 수 있습니다 None.

import string
line = line.translate(string.maketrans('', ''), '!@#$')

여기 string.maketrans만드는 데 사용되는 변환 테이블을 0 ~ 255 서수 값으로 문자를 포함하는 단지 문자열이다.


답변

여기서 요점이 누락되었거나 다음과 같습니다.

string = "ab1cd1ef"
string = string.replace("1","") 

print string
# result: "abcdef"

루프에 넣으십시오.

a = "a!b@c#d$"
b = "!@#$"
for char in b:
    a = a.replace(char,"")

print a
# result: "abcd"

답변

>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if  c not in '?:!/;' )
'abc#@efg12'

답변

re.sub파이썬 3.5부터 정규 표현식으로 쉽게 peasy

re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)

>>> import re

>>> line = 'Q: Do I write ;/.??? No!!!'

>>> re.sub('\ |\?|\.|\!|\/|\;|\:', '', line)
'QDoIwriteNo'

설명

에서 정규 표현식 (정규식), |논리적 인 OR과 \실제 정규식 명령 수 있습니다 공백 및 특수 문자를 이스케이프합니다. 반면 에이 경우 빈 문자열 sub대체를 나타냅니다 ''.


답변

문자열에서 특정 문자 허용 해야하는 역 요구 사항의 경우 set 보완 연산자로 정규식을 사용할 수 있습니다 [^ABCabc]. 예를 들어 ASCII 문자, 숫자 및 하이픈을 제외한 모든 항목을 제거하려면 다음을 수행하십시오.

>>> import string
>>> import re
>>>
>>> phrase = '  There were "nine" (9) chick-peas in my pocket!!!      '
>>> allow = string.letters + string.digits + '-'
>>> re.sub('[^%s]' % allow, '', phrase)

'Therewerenine9chick-peasinmypocket'

에서 파이썬 정규 표현식 문서 :

범위를 벗어나는 문자는 세트를 보완하여 일치시킬 수 있습니다. 세트의 첫 번째 문자가 인 경우 세트 '^'에없는 모든 문자가 일치합니다. 예를 들어, [^5]‘5’를 제외한 모든 문자와 [^^]일치하고를 제외한 모든 문자와 일치합니다
'^'. ^세트의 첫 번째 문자가 아닌 경우 특별한 의미가 없습니다.


답변

asker는 거의 그것을했다. 파이썬의 대부분의 것들과 마찬가지로 대답은 생각보다 간단합니다.

>>> line = "H E?.LL!/;O:: "  
>>> for char in ' ?.!/;:':  
...  line = line.replace(char,'')  
...
>>> print line
HELLO

중첩 된 if / for 루프를 수행 할 필요는 없지만 각 문자를 개별적으로 확인해야합니다.


답변

line = line.translate(None, " ?.!/;:")