파이썬에서 문자열의 문자를 제거하고 싶습니다.
string.replace(',', '').replace("!", '').replace(":", '').replace(";", '')...
그러나 제거해야 할 문자가 많이 있습니다. 나는 목록에 대해 생각했다
list = [',', '!', '.', ';'...]
그러나를 사용 list
하여 문자를 바꾸려면 string
어떻게 해야 합니까?
답변
python2를 사용하고 입력이 문자열 (유니 코드가 아닌) 인 경우 가장 좋은 방법은 str.translate
다음과 같습니다.
>>> chars_to_remove = ['.', '!', '?']
>>> subj = 'A.B!C?'
>>> subj.translate(None, ''.join(chars_to_remove))
'ABC'
그렇지 않으면 고려해야 할 옵션이 있습니다.
A. 제목별로 char을 반복하고 원하지 않는 문자와 join
결과 목록을 생략 하십시오.
>>> sc = set(chars_to_remove)
>>> ''.join([c for c in subj if c not in sc])
'ABC'
(제너레이터 버전의 ''.join(c for c ...)
효율성이 떨어집니다.)
B. re.sub
빈 문자열 을 사용하여 즉석에서 정규 표현식을 만듭니다 .
>>> import re
>>> rx = '[' + re.escape(''.join(chars_to_remove)) + ']'
>>> re.sub(rx, '', subj)
'ABC'
( re.escape
문자 가 정규 표현식 과 같 ^
거나 ]
깨지지 않도록합니다).
C. 다음의 매핑 변형을translate
사용하십시오 .
>>> chars_to_remove = [u'δ', u'Γ', u'ж']
>>> subj = u'AжBδCΓ'
>>> dd = {ord(c):None for c in chars_to_remove}
>>> subj.translate(dd)
u'ABC'
전체 테스트 코드 및 타이밍 :
#coding=utf8
import re
def remove_chars_iter(subj, chars):
sc = set(chars)
return ''.join([c for c in subj if c not in sc])
def remove_chars_re(subj, chars):
return re.sub('[' + re.escape(''.join(chars)) + ']', '', subj)
def remove_chars_re_unicode(subj, chars):
return re.sub(u'(?u)[' + re.escape(''.join(chars)) + ']', '', subj)
def remove_chars_translate_bytes(subj, chars):
return subj.translate(None, ''.join(chars))
def remove_chars_translate_unicode(subj, chars):
d = {ord(c):None for c in chars}
return subj.translate(d)
import timeit, sys
def profile(f):
assert f(subj, chars_to_remove) == test
t = timeit.timeit(lambda: f(subj, chars_to_remove), number=1000)
print ('{0:.3f} {1}'.format(t, f.__name__))
print (sys.version)
PYTHON2 = sys.version_info[0] == 2
print ('\n"plain" string:\n')
chars_to_remove = ['.', '!', '?']
subj = 'A.B!C?' * 1000
test = 'ABC' * 1000
profile(remove_chars_iter)
profile(remove_chars_re)
if PYTHON2:
profile(remove_chars_translate_bytes)
else:
profile(remove_chars_translate_unicode)
print ('\nunicode string:\n')
if PYTHON2:
chars_to_remove = [u'δ', u'Γ', u'ж']
subj = u'AжBδCΓ'
else:
chars_to_remove = ['δ', 'Γ', 'ж']
subj = 'AжBδCΓ'
subj = subj * 1000
test = 'ABC' * 1000
profile(remove_chars_iter)
if PYTHON2:
profile(remove_chars_re_unicode)
else:
profile(remove_chars_re)
profile(remove_chars_translate_unicode)
결과 :
2.7.5 (default, Mar 9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]
"plain" string:
0.637 remove_chars_iter
0.649 remove_chars_re
0.010 remove_chars_translate_bytes
unicode string:
0.866 remove_chars_iter
0.680 remove_chars_re_unicode
1.373 remove_chars_translate_unicode
---
3.4.2 (v3.4.2:ab2c023a9432, Oct 5 2014, 20:42:22)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
"plain" string:
0.512 remove_chars_iter
0.574 remove_chars_re
0.765 remove_chars_translate_unicode
unicode string:
0.817 remove_chars_iter
0.686 remove_chars_re
0.876 remove_chars_translate_unicode
부수적으로,에 대한 수치는 remove_chars_translate_bytes
왜 업계가 오랫동안 유니 코드를 채택하기를 꺼려했는지에 대한 단서를 제공 할 수 있습니다.
답변
당신은 사용할 수 있습니다 str.translate()
:
s.translate(None, ",!.;")
예:
>>> s = "asjo,fdjk;djaso,oio!kod.kjods;dkps"
>>> s.translate(None, ",!.;")
'asjofdjkdjasooiokodkjodsdkps'
답변
번역 방법을 사용할 수 있습니다 .
s.translate(None, '!.;,')
답변
''.join(c for c in myString if not c in badTokens)
답변
python3 을 사용 하고 translate
솔루션을 찾는 경우 기능이 변경되어 이제 2 대신 1 매개 변수를 사용합니다.
이 매개 변수는 각 키가 찾을 문자의 유니 코드 서수 (int) 인 테이블 (사전 일 수 있음)이며 값은 대체입니다 (유니 코드 서수 또는 키를 맵핑하는 문자열 일 수 있음).
사용 예는 다음과 같습니다.
>>> list = [',', '!', '.', ';']
>>> s = "This is, my! str,ing."
>>> s.translate({ord(x): '' for x in list})
'This is my string'
답변
정규식을 사용하는 또 다른 접근법 :
''.join(re.split(r'[.;!?,]', s))
답변
단순한 루프가 아닌가?
for i in replace_list:
string = string.replace(i, '')
또한 목록의 이름을 ‘list’로 지정하지 마십시오. 내장 함수를 대체합니다 list
.