파이썬을 사용하여 문자열에서 특정 문자를 제거하려고합니다. 이것은 지금 사용중인 코드입니다. 불행히도 문자열에는 아무런 영향을 미치지 않는 것으로 보입니다.
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, " ?.!/;:")