[python] 문자열에서 구두점을 제거하는 가장 좋은 방법

다음보다 간단한 방법이 있어야합니다.

import string
s = "string. With. Punctuation?" # Sample string 
out = s.translate(string.maketrans("",""), string.punctuation)

있습니까?



답변

효율성 측면에서 이길 수는 없습니다

s.translate(None, string.punctuation)

더 높은 버전의 Python의 경우 다음 코드를 사용하십시오.

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

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 = "string. With. Punctuation"
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):  # From Vinko's solution, with fix.
    return regex.sub('', s)

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

def test_repl(s):  # From S.Lott's solution
    for c in string.punctuation:
        s=s.replace(c,"")
    return s

print "sets      :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "regex     :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "replace   :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)

결과는 다음과 같습니다.

sets      : 19.8566138744
regex     : 6.86155414581
translate : 2.12455511093
replace   : 28.4436721802


답변

정규 표현식은 알고 있다면 충분히 간단합니다.

import re
s = "string. With. Punctuation?"
s = re.sub(r'[^\w\s]','',s)


답변

사용법의 편의를 위해 Python 2와 Python 3의 문자열에서 스트라이핑 구두점에 대한 메모를 요약합니다. 자세한 설명은 다른 답변을 참조하십시오.


파이썬 2

import string

s = "string. With. Punctuation?"
table = string.maketrans("","")
new_s = s.translate(table, string.punctuation)      # Output: string without punctuation

파이썬 3

import string

s = "string. With. Punctuation?"
table = str.maketrans(dict.fromkeys(string.punctuation))  # OR {key: None for key in string.punctuation}
new_s = s.translate(table)                          # Output: string without punctuation


답변

myString.translate(None, string.punctuation)


답변

나는 보통 다음과 같은 것을 사용합니다 :

>>> s = "string. With. Punctuation?" # Sample string
>>> import string
>>> for c in string.punctuation:
...     s= s.replace(c,"")
...
>>> s
'string With Punctuation'


답변

string.punctuationASCII 만입니다 ! 더 정확한 (그러나 훨씬 더 느린) 방법은 unicodedata 모듈을 사용하는 것입니다.

# -*- coding: utf-8 -*-
from unicodedata import category
s = u'String — with -  «punctation »...'
s = ''.join(ch for ch in s if category(ch)[0] != 'P')
print 'stripped', s

다른 유형의 문자도 일반화하고 제거 할 수 있습니다.

''.join(ch for ch in s if category(ch)[0] not in 'SP')

또한 ~*+§$관점에 따라 “마침표”일 수도 있고 아닐 수도있는 문자를 제거합니다 .


답변

가족과 더 친숙하다면 더 간단 할 필요는 없지만 다른 방법입니다.

import re, string
s = "string. With. Punctuation?" # Sample string 
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)