문자열에서 특수 문자, 문장 부호 및 공백을 모두 제거하십시오.
문자와 숫자 만 가질 수 있도록 문자열에서 모든 특수 문자, 문장 부호 및 공백을 제거해야합니다.
이것은 정규 표현식없이 수행 할 수 있습니다 :
>>> 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.7061979771string2
-결과 : 7.78372597694
실시 예 2
import re re.sub('[^A-Za-z0-9]+', '', string)
string1
-결과 : 7.10785102844string2
-결과 : 4.12814903259
실시 예 3
import re re.sub('\W+','', string)
string1
-결과 : 3.11899876595string2
-결과 : 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))
or to pass list
in join use (not sure but can be fast a bit)
''.join([*filter(str.isalnum, string)])
note: unpacking in [*args]
valid from Python >= 3.5
#!/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
you can add more special character and that will be replaced by '' means nothing i.e they will be removed.
Differently than everyone else did using regex, I would try to exclude every character that is not what I want, instead of enumerating explicitly what I don't want.
For example, if I want only characters from 'a to z' (upper and lower case) and numbers, I would exclude everything else:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
This means "substitute every character that is not a number, or a character in the range 'a to z' or 'A to Z' with an empty string".
In fact, if you insert the special character ^
at the first place of your regex, you will get the negation.
Extra tip: if you also need to lowercase the result, you can make the regex even faster and easier, as long as you won't find any uppercase now.
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
Assuming you want to use a regex and you want/need Unicode-cognisant 2.x code that is 2to3-ready:
>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
The most generic approach is using the 'categories' of the unicodedata table which classifies every single character. E.g. the following code filters only printable characters based on their category:
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' ')
Look at the given URL above for all related categories. You also can of course filter by the punctuation categories.
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
Use translate:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Caveat: Only works on ascii strings.
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
and you shall see your result as
'askhnlaskdjalsdk
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
same as double quotes."""
# 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"))
'IT story' 카테고리의 다른 글
실행기의 치명적인 오류 : ""C : \ Program Files (x86) \ Python33 \ python.exe ""C : \ Program Files (x86) \ Python33 \ pip.exe ""를 사용하여 프로세스를 만들 수 없습니다. (0) | 2020.05.11 |
---|---|
base64 데이터 문자열에서 PNG 이미지 서버 측을 저장하는 방법 (0) | 2020.05.11 |
UITapGestureRecognizer가 UITableView를 중단 함 didSelectRowAtIndexPath (0) | 2020.05.11 |
Node.js에서 여러 module.exports 선언 (0) | 2020.05.11 |
Swift에서 ViewController를 해제하는 방법? (0) | 2020.05.11 |