파이썬을 사용하여 영숫자가 아닌 모든 문자를 문자열에서 제거하는 가장 좋은 방법은 무엇입니까?
이 질문 의 PHP 변형에 제시된 솔루션은 약간의 조정으로 작동하지만 아마도 나에게 ‘피 토닉’하지는 않습니다.
기록을 위해 마침표와 쉼표 (및 기타 문장 부호)를 제거하고 따옴표, 대괄호 등을 제거하고 싶지 않습니다.
답변
방금 호기심에서 일부 기능을 시간을 보냈습니다. 이 테스트에서는 문자열 string.printable
(내장 string
모듈의 일부) 에서 영숫자가 아닌 문자를 제거 합니다. 컴파일의 사용 '[\W_]+'
및 pattern.sub('', str)
빠른 것으로 밝혀졌다.
$ python -m timeit -s \
"import string" \
"''.join(ch for ch in string.printable if ch.isalnum())"
10000 loops, best of 3: 57.6 usec per loop
$ python -m timeit -s \
"import string" \
"filter(str.isalnum, string.printable)"
10000 loops, best of 3: 37.9 usec per loop
$ python -m timeit -s \
"import re, string" \
"re.sub('[\W_]', '', string.printable)"
10000 loops, best of 3: 27.5 usec per loop
$ python -m timeit -s \
"import re, string" \
"re.sub('[\W_]+', '', string.printable)"
100000 loops, best of 3: 15 usec per loop
$ python -m timeit -s \
"import re, string; pattern = re.compile('[\W_]+')" \
"pattern.sub('', string.printable)"
100000 loops, best of 3: 11.2 usec per loop
답변
구조에 대한 정규식 :
import re
re.sub(r'\W+', '', your_string)
파이썬 정의에
'\W
==[^a-zA-Z0-9_]
, 제외 모든numbers
,letters
및_
답변
str.translate () 메소드를 사용하십시오 .
당신이 이것을 자주 할 것이라고 가정 :
(1) 한 번 삭제하려는 모든 문자가 포함 된 문자열을 만듭니다.
delchars = ''.join(c for c in map(chr, range(256)) if not c.isalnum())
(2) 줄을 긁을 때마다 :
scrunched = s.translate(None, delchars)
설치 비용은 아마도 re.compile과 유리하게 비교 될 것입니다. 한계 비용은 훨씬 낮습니다.
C:\junk>\python26\python -mtimeit -s"import string;d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s=string.printable" "s.translate(None,d)"
100000 loops, best of 3: 2.04 usec per loop
C:\junk>\python26\python -mtimeit -s"import re,string;s=string.printable;r=re.compile(r'[\W_]+')" "r.sub('',s)"
100000 loops, best of 3: 7.34 usec per loop
참고 : 벤치 마크 데이터로 string.printable을 사용하면 패턴 ‘[\ W _] +’에 불공정 한 이점이 있습니다 . 영숫자가 아닌 문자는 모두 한 묶음에 있습니다. 일반적인 데이터에는 둘 이상의 대체 문자가 있습니다.
C:\junk>\python26\python -c "import string; s = string.printable; print len(s),repr(s)"
100 '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'
re.sub에게 더 많은 작업을 수행하면 어떻게됩니까?
C:\junk>\python26\python -mtimeit -s"d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s='foo-'*25" "s.translate(None,d)"
1000000 loops, best of 3: 1.97 usec per loop
C:\junk>\python26\python -mtimeit -s"import re;s='foo-'*25;r=re.compile(r'[\W_]+')" "r.sub('',s)"
10000 loops, best of 3: 26.4 usec per loop
답변
시도해 볼 수 있습니다 :
print ''.join(ch for ch in some_string if ch.isalnum())
답변
>>> import re
>>> string = "Kl13@£$%[};'\""
>>> pattern = re.compile('\W')
>>> string = re.sub(pattern, '', string)
>>> print string
Kl13
답변
어때요?
def ExtractAlphanumeric(InputString):
from string import ascii_letters, digits
return "".join([ch for ch in InputString if ch in (ascii_letters + digits)])
이것은 목록 이해를 사용하여 문자 InputString
가 결합 ascii_letters
및 digits
문자열 에있는 경우 문자 목록을 생성합니다 . 그런 다음 목록을 문자열로 결합합니다.
답변
여기에 다른 답변에서 나온 것처럼 문자열 내용을 제한하려는 문자 집합을 정의하는 매우 간단하고 유연한 방법을 제공합니다. 이 경우 알파벳 숫자 PLUS 대시와 밑줄을 허용합니다. PERMITTED_CHARS
사용 사례에 따라 내 문자를 추가하거나 제거하십시오 .
PERMITTED_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-"
someString = "".join(c for c in someString if c in PERMITTED_CHARS)