[python] 문자열에서 문자 목록 제거

파이썬에서 문자열의 문자를 제거하고 싶습니다.

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.