1

私は単語を一連の文字 (a から Z まで) として定義します。これにはアポストロフィも含まれる場合があります。単語からアポストロフィを削除して、文を単語に分割したいと考えています。

私は現在、テキストから単語を取得するために次のことを行っています。

import re
text = "Don't ' thread \r\n on \nme ''\n "
words_iter = re.finditer(r'(\w|\')+', text)
words = (word.group(0).lower() for word in words_iter)
for i in words:
    print(i)

これは私に与えます:

don't
'
thread
on
me
''

しかし、私が望んでいないのは:

dont
thread
on
me

これを実現するためにコードを変更するにはどうすればよいですか?

'私の出力には何もないことに注意してください。

私もwords発電機になりたいです。

4

4 に答える 4

3

これは正規表現の仕事のようです。

import re

text = "Don't ' thread \r\n on \nme ''\n "

# Define a function so as to make a generator
def get_words(text):

    # Find each block, separated by spaces
    for section in re.finditer("[^\s]+", text):

        # Get the text from the selection, lowercase it
        # (`.lower()` for Python 2 or if you hate people who use Unicode)
        section = section.group().casefold()

        # Filter so only letters are kept and yield
        section = "".join(char for char in section if char.isalpha())
        if section:
            yield section

list(get_words(text))
#>>> ['dont', 'thread', 'on', 'me']

正規表現の説明:

[^    # An "inverse set" of characters, matches anything that isn't in the set
\s    # Any whitespace character
]+    # One or more times

したがって、これは非空白文字の任意のブロックに一致します。

于 2013-09-23T14:18:10.227 に答える
0

str.translateと の使用re.finditer:

>>> text = "Don't ' thread \r\n on \nme ''\n "
>>> import re
>>> from string import punctuation
>>> tab = dict.fromkeys(map(ord, punctuation))
def solve(text):
    for m in re.finditer(r'\b(\S+)\b', text):
        x = m.group(1).translate(tab).lower()
        if x : yield x
>>> list(solve(text))
['dont', 'thread', 'on', 'me']

タイミング比較:

>>> strs = text * 1000
>>> %timeit list(solve(strs))
10 loops, best of 3: 11.1 ms per loop
>>> %timeit list(get_words(strs))
10 loops, best of 3: 36.7 ms per loop
>>> strs = text * 10000
>>> %timeit list(solve(strs))
1 loops, best of 3: 146 ms per loop
>>> %timeit list(get_words(strs))
1 loops, best of 3: 411 ms per loop
于 2013-09-23T14:18:13.810 に答える