IT story

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

hot-time 2020. 5. 11. 08:04
반응형

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


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


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

>>> 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)) 

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"))

참고URL : https://stackoverflow.com/questions/5843518/remove-all-special-characters-punctuation-and-spaces-from-string

반응형