2009-03-17 6 views
2

나는 문장 부호를 무시하고 텍스트를 단어로 분리하는 파이썬 함수를 작성하고있다. 여기에 몇 가지 작업 코드가 있습니다. 나는 목록에서 문자열을 생성하는 것이 효율적이라고 확신하지는 못한다. (코드에서 buf = [])는 효율적이다. 누구든지이 작업을 수행하는 더 좋은 방법에 대한 제안을 갖고 있습니까?반복적으로 파이썬에서 문자열에 추가하는 효과적인 방법은 무엇입니까?

def getwords(text, splitchars=' \t|!?.;:"'): 
    """ 
    Generator to get words in text by splitting text along specified splitchars 
    and stripping out the splitchars:: 

     >>> list(getwords('this is some text.')) 
     ['this', 'is', 'some', 'text'] 
     >>> list(getwords('and/or')) 
     ['and', 'or'] 
     >>> list(getwords('one||two')) 
     ['one', 'two'] 
     >>> list(getwords(u'hola unicode!')) 
     [u'hola', u'unicode'] 
    """ 
    splitchars = set(splitchars) 
    buf = [] 
    for char in text: 
     if char not in splitchars: 
      buf.append(char) 
     else: 
      if buf: 
       yield ''.join(buf) 
       buf = [] 
    # All done. Yield last word. 
    if buf: 
     yield ''.join(buf) 
+0

너무 나쁨 ... 여기에 누가 가장 좋은 답변을 넣었는지, 내장 된 분할로 둘 이상의 머리말을 붙일 수 있다고 말했습니다. 당신은 그의 코드가 추악하다고 말했고, 그는 그의 메시지를 삭제했습니다. – fulmicoton

답변

3

당신은 re.split을 사용할 수 있습니다

re.split('[\s|!\?\.;:"]', text) 

그러나 텍스트가 매우 큰 경우 결과 배열이 너무 많은 메모리를 소비 할 수 있습니다. 그런 다음 다시 생각해보십시오. 빈도 :

import re 
def getwords(text, splitchars=' \t|!?.;:"'): 
    words_iter = re.finditer(
    "([%s]+)" % "".join([("^" + c) for c in splitchars]), 
    text) 
    for word in words_iter: 
    yield word.group() 

# a quick test 
s = "a:b cc? def...a||" 
words = [x for x in getwords(s)] 
assert ["a", "b", "cc", "def", "a"] == words, words 
4

re.split을 사용하지 않으시겠습니까? 파이썬에서 문자열을 연결뿐만 아니라 성능을 평가하는 몇 가지 방법에 대한

import re 
re.split("[,; ]+", "coucou1 , coucou2;coucou3") 
+0

전혀 생각하지 않았어. 그것을 고려할 것입니다. 감사! –

5
+0

이것이 내가 필요한 것입니다. 감사. cStringIO는 사용 사례에 가장 적합한 선택입니다. –

+0

어 오. cStringIO는 유니 코드 문자열을 처리 할 수 ​​없습니다. –

+0

그게 무슨 가치가 있는지에 대해서 : 나는 Python 2.5가 설치 될 때까지 그 테스트 케이스를 해킹했고, 방법 6 (피드 ''. 목록 이해력에 합류)이 일관성있게 가장 빠르다는 것을 발견했다. 6 - 생성기 표현식이 느린 *이지만 여전히 두 번째로 빠름. – kquinn

1

당신은 re.split()를 사용하여 입력 분할 할 수 있습니다 :

>>> splitchars=' \t|!?.;:"' 
>>> re.split("[%s]" % splitchars, "one\ttwo|three?four") 
['one', 'two', 'three', 'four'] 
>>> 

편집 : 당신의 splitchars] 또는 ^ 같은 특수 문자를 포함 할 수 있다면, 당신이 사용할 수있는 re.escpae()

>>> re.escape(splitchars) 
'\\ \\\t\\|\\!\\?\\.\\;\\:\\"' 
>>> re.split("[%s]" % re.escape(splitchars), "one\ttwo|three?four") 
['one', 'two', 'three', 'four'] 
>>> 
관련 문제