[python] Python, 문자열에서 알파벳이 아닌 모든 문자 제거

파이썬 MapReduce 단어 수 프로그램을 작성 중입니다. 문제는 데이터에 흩어져있는 많은 비 알파벳 문자가 있다는 것입니다.이 게시물 은 정규식을 사용하여 멋진 솔루션을 보여주는 Python의 문자열에서 영숫자 문자를 제외한 모든 것을 제거했지만 구현 방법을 모르겠습니다

def mapfn(k, v):
    print v
    import re, string
    pattern = re.compile('[\W_]+')
    v = pattern.match(v)
    print v
    for w in v.split():
        yield w, 1

나는 re그 문제에 대해 라이브러리 또는 정규식 을 사용하는 방법을 잘 모르겠습니다 . v영숫자가 아닌 문자없이 새 줄을 검색 하기 위해 들어오는 문자열 (책의 줄)에 정규식 패턴을 적용하는 방법을 잘 모르겠습니다 .

제안?



답변

사용하다 re.sub

import re

regex = re.compile('[^a-zA-Z]')
#First parameter is the replacement, second parameter is your input string
regex.sub('', 'ab3d*E')
#Out: 'abdE'

또는 특정 문자 집합 만 제거하려는 경우 (아포스트로피가 입력해도 괜찮을 수 있으므로 …)

regex = re.compile('[,\.!?]') #etc.


답변

정규식을 사용하지 않으려면 시도해 볼 수 있습니다.

''.join([i for i in s if i.isalpha()])


답변

re.sub () 함수를 사용하여 다음 문자를 제거 할 수 있습니다.

>>> import re
>>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def")
'ABCabcdef'

re.sub (패턴 일치, 문자열 교체, 검색 할 문자열)

  • "[^a-zA-Z]+" -a-zA-z가 아닌 문자 그룹을 찾습니다.
  • "" -일치하는 문자를 “”로 바꿉니다.


답변

시험:

s = ''.join(filter(str.isalnum, s))

이것은 문자열에서 모든 문자를 취하고 영숫자 만 유지하고 문자열을 다시 만듭니다.


답변

가장 빠른 방법은 정규식입니다.

#Try with regex first
t0 = timeit.timeit("""
s = r2.sub('', st)

""", setup = """
import re
r2 = re.compile(r'[^a-zA-Z0-9]', re.MULTILINE)
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)

#Try with join method on filter
t0 = timeit.timeit("""
s = ''.join(filter(str.isalnum, st))

""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""",
number = 1000000)
print(t0)

#Try with only join
t0 = timeit.timeit("""
s = ''.join(c for c in st if c.isalnum())

""", setup = """
st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+'
""", number = 1000000)
print(t0)


2.6002226710006653 Method 1 Regex
5.739747313000407 Method 2 Filter + Join
6.540099570000166 Method 3 Join


답변

특정 유니 코드 속성 클래스를 일치 시키려는regex 경우 PyPi 모듈 을 사용하는 것이 좋습니다 . 이 라이브러리는 특히 큰 텍스트를 처리하는 등 더 안정적인 것으로 입증되었으며 다양한 Python 버전에서 일관된 결과를 산출합니다. 최신 상태로 유지하기 만하면됩니다.

설치 ( pip intall regex또는 사용 pip3 install regex)하면 다음을 사용할 수 있습니다.

import regex
print ( regex.sub(r'\P{L}+', '', 'ABCŁąć1-2!Абв3§4“5def”') )
// => ABCŁąćАбвdef

에서 유니 코드 문자를 제외한 1 개 이상의 문자의 모든 청크를 제거합니다 text. 온라인 Python 데모를 참조하십시오 . "".join(regex.findall(r'\p{L}+', 'ABCŁąć1-2!Абв3§4“5def”'))동일한 결과를 얻기 위해 를 사용할 수도 있습니다.

Python에서는 re유니 코드 문자와 일치시키기 위해 [^\W\d_]( Match any unicode letter? ) 구문을 사용할 수 있습니다 .

따라서 문자가 아닌 모든 문자를 제거하려면 모든 문자를 일치시키고 결과를 결합 할 수 있습니다.

result = "".join(re.findall(r'[^\W\d_]', text))

또는 [^\W\d_]다음 과 일치하는 문자 이외의 모든 문자를 제거하십시오 .

result = re.sub(r'([^\W\d_])|.', r'\1', text, re.DOTALL)

온라인 정규식 데모를 참조하십시오 . 그러나 유니 코드 표준이 발전하고 있고 일치하는 문자 집합 \w이 Python 버전에 따라 달라 지기 때문에 다양한 Python 버전에서 일관성없는 결과를 얻을 수 있습니다 . regex일관된 결과를 얻으려면 PyPi 라이브러리를 사용 하는 것이 좋습니다.


답변