카테고리 보관물: Python

Python

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

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

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, " ?.!/;:")