다음보다 간단한 방법이 있어야합니다.
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.punctuation
ASCII 만입니다 ! 더 정확한 (그러나 훨씬 더 느린) 방법은 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)