从python中的字符串中提取英语单词

问题描述

您实际上有两个问题。

首先,这:

line = re.sub("[^A-Za-z]", "", line.strip())

这将从行中删除所有非字母。这意味着您将不再有任何空格可分割,因此无法将其分隔为单词。

接下来,即使您没有这样做,也可以这样做:

words = ' '.join(line.split())

这不会给您单词列表,而是给您一个字符串,所有这些单词都串联在一起。(基本上,所有空白行的原始行都转换为一个空格。)

因此,在下一行中,当您执行此操作时:

for word in words:

您正在遍历一个字符串,这意味着每个字符串word都是一个字符。因为这就是字符串:字符的可迭代数。

如果您想要每个单词(正如您的变量名所暗示的那样),那么您已经拥有了这些单词,问题在于您将它们重新加入了一个字符串中。只是不要这样做:

words = line.split()
for word in words:

或者,如果要去除字母和空格之外的内容,请使用正则表达式去除字母和空格之外的所有内容,而不要使用除字母和空格之外的所有内容包括空格)的正则表达式:

line = re.sub(r"[^A-Za-z\s]", "", line.strip())
words = line.split()
for word in words:

但是,该模式可能仍然不是您想要的。您是否真的要'abc1def'变成一个字符串'abcdef',还是变成两个字符串,'abc'然后'def'?您可能想要这样:

line = re.sub(r"[^A-Za-z]", " ", line.strip())
words = line.split()
for word in words:

… 要不就:

words = re.split(r"[^A-Za-z]", line.strip())
for word in words:

解决方法

我有一个文档,每一行都是一个字符串。它可能包含数字,非英文字母和单词,符号(例如!和*)。我想从每一行中提取英语单词(英语单词之间用空格隔开)。我的代码如下,这是我的map-
reduce作业的map函数。但是,基于最终结果,此映射器函数仅产生字母(例如a,b,c)频率计数。谁能帮我找到错误?谢谢

import sys
import re

for line in sys.stdin:
    line = re.sub("[^A-Za-z]","",line.strip())
    line = line.lower()
    words = ' '.join(line.split())
    for word in words:
        print '%s\t%s' % (word,1)