본문 바로가기
Python/Python FAQ

Python 문자열에서 구두점을 제거하는 가장 좋은 방법, Best way to strip punctuation from a string

by 베타코드 2023. 6. 30.
반응형

질문


더 간단한 방법이 있어야 할 것 같습니다:

import string
s = "string. With. Punctuation?" # 샘플 문자열
out = s.translate(string.maketrans("",""), string.punctuation)

있을까요?


답변


효율적인 관점에서, 다음을 이길 수는 없습니다.

s.translate(None, string.punctuation)

Python의 더 높은 버전에서는 다음 코드를 사용하십시오:

s.translate(str.maketrans('', '', string.punctuation))

이는 C에서 룩업 테이블을 사용하여 원시 문자열 작업을 수행합니다. 이를 이길 수 있는 것은 C 코드를 직접 작성하는 것뿐입니다.

속도가 걱정되지 않는다면, 다른 옵션은 다음과 같습니다:

exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)

이는 각 문자마다 s.replace보다 빠르지만, 정규식이나 string.translate와 같은 순수 파이썬 접근법만큼 잘 수행되지는 않습니다. 아래의 시간 측정 결과에서 확인할 수 있습니다. 이러한 유형의 문제에서 가능한 한 낮은 수준에서 작업하는 것이 가장 효과적입니다.

시간 측정 코드:

import re, string, timeit

s = "문자열. 구두점이 있습니다."
exclude = set(string.punctuation)
table = string.maketrans("","")
regex = re.compile('[%s]' % re.escape(string.punctuation))

def test_set(s):
    return ''.join(ch for ch in s if ch not in exclude)

def test_re(s):  # Vinko의 솔루션을 수정한 것입니다.
    return regex.sub('', s)

def test_trans(s):
    return s.translate(table, string.punctuation)

def test_repl(s):  # S.Lott의 솔루션입니다.
    for c in string.punctuation:
        s=s.replace(c,"")
    return s

print "집합      :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "정규식     :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "번역      :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "교체      :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)

다음은 결과입니다:

집합      : 19.8566138744
정규식     : 6.86155414581
번역      : 2.12455511093
교체      : 28.4436721802
반응형

댓글