[python] 문자열에서 특수 문자, 문장 부호 및 공백을 모두 제거하십시오.

문자와 숫자 만 가질 수 있도록 문자열에서 모든 특수 문자, 문장 부호 및 공백을 제거해야합니다.



답변

이것은 정규 표현식없이 수행 할 수 있습니다 :

>>> string = "Special $#! characters   spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'

당신은 사용할 수 있습니다 str.isalnum:

S.isalnum() -> bool

Return True if all characters in S are alphanumeric
and there is at least one character in S, False otherwise.

정규식 사용을 고집하면 다른 해결책이 좋습니다. 그러나 정규 표현식을 사용하지 않고 수행 할 수 있다면 가장 좋은 방법입니다.


답변

문자 나 숫자가 아닌 문자열과 일치하는 정규식은 다음과 같습니다.

[^A-Za-z0-9]+

정규식 대체를 수행하는 Python 명령은 다음과 같습니다.

re.sub('[^A-Za-z0-9]+', '', mystring)


답변

더 짧은 방법 :

import re
cleanString = re.sub('\W+','', string )

단어와 숫자 사이에 공백을 원하면 ”를 ‘


답변

이것을 본 후, 나는 가장 적은 시간에 실행되는 것을 찾아서 제공된 답변을 확장하는 데 관심이 있었으므로 제안 된 답변 중 일부를 timeit두 개의 예제 문자열 과 비교 하여 확인했습니다 .

  • string1 = 'Special $#! characters spaces 888323'
  • string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'

실시 예 1

'.join(e for e in string if e.isalnum())

  • string1 -결과 : 10.7061979771
  • string2 -결과 : 7.78372597694

실시 예 2

import re
re.sub('[^A-Za-z0-9]+', '', string)

  • string1 -결과 : 7.10785102844
  • string2 -결과 : 4.12814903259

실시 예 3

import re
re.sub('\W+','', string)

  • string1 -결과 : 3.11899876595
  • string2 -결과 : 2.78014397621

위의 결과는 평균에서 다음과 같이 가장 낮은 결과를 얻었습니다 repeat(3, 2000000)

예 3예 1 보다 3 배 더 빠를 수 있습니다 .


답변

파이썬 2. *

난 그냥 filter(str.isalnum, string)작동 생각

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'

파이썬 3. *

Python3에서 filter( )함수는 위와 달리 문자열 대신 반복 가능한 객체를 반환합니다. itertable에서 문자열을 얻으려면 다시 결합해야합니다.

''.join(filter(str.isalnum, string)) 

또는 list결합 사용 에 전달 하기 ( 확실하지 않지만 조금 빠를 수 있음 )

''.join([*filter(str.isalnum, string)])

참고 : Python> = 3.5 에서 [*args]유효한 포장 풀기


답변

#!/usr/bin/python
import re

strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr

더 많은 특수 문자를 추가 할 수 있으며 ”로 대체됩니다. 즉, 제거되지 않습니다.


답변

다른 사람들이 정규식을 사용하는 것과 달리, 내가 원하지 않는 것을 명시 적으로 열거하는 대신 내가 원하지 않는 모든 문자를 제외하려고합니다 .

예를 들어 ‘a에서 z’까지의 문자 (대문자 및 소문자)와 숫자 만 원하면 다른 모든 것을 제외합니다.

import re
s = re.sub(r"[^a-zA-Z0-9]","",s)

이것은 “숫자가 아닌 모든 문자 또는 빈 문자열로 ‘a ~ z’또는 ‘A ~ Z’범위의 문자를 대체합니다”를 의미합니다.

실제로 ^정규 표현식의 첫 번째 위치에 특수 문자를 삽입 하면 부정이 발생합니다.

추가 팁 : 결과 를 소문자 로 사용해야하는 경우 대문자를 찾지 않는 한 정규식을 더 빠르고 쉽게 만들 수 있습니다.

import re
s = re.sub(r"[^a-z0-9]","",s.lower())