답변:
이것은 정규 표현식없이 수행 할 수 있습니다 :
>>> 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.
정규식 사용을 고집하면 다른 해결책이 좋습니다. 그러나 정규 표현식을 사용하지 않고 수행 할 수 있다면 가장 좋은 방법입니다.
isalnum()
정규식과 정규식 버전을 벤치마킹 했고 정규식은 50-75 % 더 빠릅니다
문자 나 숫자가 아닌 문자열과 일치하는 정규식은 다음과 같습니다.
[^A-Za-z0-9]+
정규식 대체를 수행하는 Python 명령은 다음과 같습니다.
re.sub('[^A-Za-z0-9]+', '', mystring)
+
효율을 조금 높이기 위해 수량
[^A-Za-z0-9 ]+
더 짧은 방법 :
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!!!'
'.join(e for e in string if e.isalnum())
string1
-결과 : 10.7061979771string2
-결과 : 7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
-결과 : 7.10785102844string2
-결과 : 4.12814903259import re
re.sub('\W+','', string)
string1
-결과 : 3.11899876595string2
-결과 : 2.78014397621위의 결과는 평균에서 다음과 같이 가장 낮은 결과를 얻었습니다 repeat(3, 2000000)
예 3 은 예 1 보다 3 배 더 빠를 수 있습니다 .
''.join([*filter(str.isalnum, string)])
난 그냥 filter(str.isalnum, string)
작동 생각
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
Python3에서 filter( )
함수는 위와 달리 문자열 대신 반복 가능한 객체를 반환합니다. itertable에서 문자열을 얻으려면 다시 결합해야합니다.
''.join(filter(str.isalnum, string))
또는 list
결합 사용 에 전달 하기 ( 확실하지 않지만 조금 빠를 수 있음 )
''.join([*filter(str.isalnum, string)])
참고 : Python> = 3.5 에서 [*args]
유효한 포장 풀기
map
에서 filter
, reduce
대신 itertable 객체를 반환합니다. 여전히 Python3 이상에서는 허용 된 답변보다 선호합니다 ''.join(filter(str.isalnum, string))
(또는 조인 사용 목록을 전달 ''.join([*filter(str.isalnum, string)])
).
''.join(filter(str.isalnum, string))
만한 것이 확실하지 않다 filter(str.isalnum, string)
. 이것이 실제로 Pythreenic입니까 (예, 사용할 수 있습니다)이 작업을 수행합니까?
filter(str.isalnum, string)
로 Python3에서 문자열을 반환하지 않는 filter( )
파이썬 2와 달리 인수 유형보다는 반복자를 반환 Python3에 +.
다른 사람들이 정규식을 사용하는 것과 달리, 내가 원하지 않는 것을 명시 적으로 열거하는 대신 내가 원하지 않는 모든 문자를 제외하려고합니다 .
예를 들어 '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())
가장 일반적인 접근 방식은 모든 단일 문자를 분류하는 unicodedata 테이블의 '범주'를 사용하는 것입니다. 예를 들어 다음 코드는 해당 범주를 기준으로 인쇄 가능한 문자 만 필터링합니다.
import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien
PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))
def filter_non_printable(s):
result = []
ws_last = False
for c in s:
c = unicodedata.category(c) in PRINTABLE and c or u'#'
result.append(c)
return u''.join(result).replace(u'#', u' ')
모든 관련 카테고리는 위의 지정된 URL을 확인하십시오. 구두점 카테고리별로 필터링 할 수도 있습니다.
$
각 줄의 끝에는 무엇이 있습니까?
번역 사용 :
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
주의 사항 : ASCII 문자열에서만 작동합니다.
TypeError: translate() takes exactly one argument (2 given)
py3.4를 얻는다
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the
큰 따옴표와 동일합니다. "" "
# if we need to count the word python that ends with or without ',' or '.' at end
count = 0
for i in text:
if i.endswith("."):
text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
count += 1
print("The count of Python : ", text.count("python"))
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
그리고 당신은 당신의 결과를
'askhnlaskdjalsdk
re
왔지만 사용하지는 않았습니다. 귀하의 replace
기준이 특정한 문자열을 사용할 수 있습니다. 만약 당신의 문자열이 abc = "askhnl#$%!askdjalsdk"
무엇입니까? #$%
패턴 이외의 다른 것으로는 작동하지 않을 것이라고 생각합니다 . 그것을 조정하고 싶을지도 모른다