파이썬 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 라이브러리를 사용 하는 것이 좋습니다.