2

指定された句読点を無視して、テキストを単語に分割するPython関数を作成しています。これがいくつかの動作するコードです。ただし、リスト(コード内の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)
4

4 に答える 4

5

http://www.skymind.com/~ocrow/python_string/は、Pythonで文字列を連結するいくつかの方法について説明し、それらのパフォーマンスも評価します。

于 2009-03-17T07:08:57.443 に答える
4

re.splitを使いたくないですか?

import re
re.split("[,; ]+", "coucou1 ,   coucou2;coucou3")
于 2009-03-17T07:08:48.100 に答える
3

re.splitを使用できます

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

ただし、テキストが非常に大きい場合、結果の配列はメモリを消費しすぎる可能性があります。次に、re.finditerを検討できます。

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
于 2009-03-17T07:36:10.000 に答える
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']
>>> 
于 2009-03-17T07:25:01.477 に答える