먼저 정규식 또는 str.translate(...)
기반 솔루션이 가장 성능이 우수 하다는 다른 사람들과 동의하고 싶습니다 . 유스 케이스의 경우이 기능의 성능은 중요하지 않으므로 해당 기준으로 고려한 아이디어를 추가하고 싶었습니다.
내 주요 목표는 다른 답변의 아이디어를 하나의 솔루션으로 일반화하여 정규 표현식 단어 이상을 포함하는 문자열에 사용할 수 있습니다 (즉, 문장 부호 문자의 명시 적 하위 세트를 허용하는 단어 단어를 허용하는 단어 목록).
모든 접근 방식에서 string.punctuation
수동으로 정의 된 목록 대신 사용 을 고려할 수도 있습니다 .
옵션 1-하위
나는 지금까지 대답이 re.sub (...)을 사용하지 않는 것을보고 놀랐습니다 . 이 문제에 대한 간단하고 자연스러운 접근 방식을 찾으십시오.
import re
my_str = "Hey, you - what are you doing here!?"
words = re.split(r'\s+', re.sub(r'[,\-!?]', ' ', my_str).strip())
이 솔루션에서는 re.sub(...)
내부에 대한 호출을 중첩 re.split(...)
했지만 성능이 중요하면 외부에서 정규식을 컴파일하는 것이 도움이 될 수 있습니다. 사용 사례의 경우 그 차이는 크지 않았으므로 단순성과 가독성을 선호합니다.
옵션 2-str.replace
이것은 몇 줄 더 있지만 정규 표현식에서 특정 문자를 이스케이프 해야하는지 여부를 확인하지 않고도 확장 할 수 있다는 이점이 있습니다.
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
for r in replacements:
my_str = my_str.replace(r, ' ')
words = my_str.split()
대신 str.replace를 문자열에 매핑하는 것이 좋았지 만 변경할 수없는 문자열로 수행 할 수 있다고 생각하지 않으며 문자 목록에 대한 매핑이 작동하는 동안 모든 문자에 대해 모든 교체를 실행합니다 과도하게 들린다. (편집 : 기능적인 예는 다음 옵션을 참조하십시오.)
옵션 3-functools.reduce
Python 2에서는 reduce
functools에서 가져 오지 않고 전역 네임 스페이스에서 사용할 수 있습니다.
import functools
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
my_str = functools.reduce(lambda s, sep: s.replace(sep, ' '), replacements, my_str)
words = my_str.split()