问题描述
您实际上有两个问题。
首先,这:
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)