我正在尝试计算字符串中的单词数。但是,我首先必须删除一些标点符号,例如
line = "i want you , to know , my name . "
运行
en = line.translate(string.maketrans('', ''), '!,.?')
产生
en = "i want you to know my name "
在此之后,我想计算一行中的单词数。但是当我做len(en)时,我得到30而不是7。
在en上使用split来标记化并找到长度并不适用于所有情况。 e.g。
我试过它并不总是有效。例如考虑这个字符串。
"i ccc bcc the a of the abc ccc dd on aaa , 28 abc 19 ."
然后变成:
"i ccc bcc the a of the abc ccc dd on aaa 28 abc 19 "
但len(en)返回17而不是15。
你可以帮忙吗?感谢答案 0 :(得分:11)
en.split(' ')
的问题是你的字符串中有额外的空格,这会给出空的匹配。您可以通过调用en.split()
来轻松解决此问题。
但也许您可以使用正则表达式使用这种不同的方法(现在不需要首先删除标点符号):
import re
print len(re.findall(r'\w+', line))
查看在线工作:ideone
答案 1 :(得分:5)
而不是使用正则表达式\w+
,使用\b
来计算单词的速度要快得多,如下所示:
import re
_re_word_boundaries = re.compile(r'\b')
def num_words(line):
return len(_re_word_boundaries.findall(line)) >> 1
请注意,我们必须将数字减半,因为\b
在单词的开头和结尾都匹配。不幸的是,与egrep不同,Python不支持仅在开头或结尾进行匹配。
如果你的行很长并且关注内存,那么使用迭代器可能是一个更好的解决方案:
def num_words(line):
return sum(1 for word in _re_word_boundaries.finditer(line)) >> 1
答案 2 :(得分:1)
len函数计算变量的长度,在本例中,该变量是字符串的长度,即30个字符。要对单词进行计数,您需要在空格上拆分字符串,然后计算返回的项目数。
答案 3 :(得分:1)
def main():
# get the user msg
print "this program tells you how many words are in your sentence."
message = raw_input("Enter message: ")
wrdcount = 0
for i in message.split():
eawrdlen = len(i) / len(i)
wrdcount = wrdcount + eawrdlen
print wrdcount
main()
答案 4 :(得分:1)
您可以使用NLTK:
import nltk
en = "i ccc bcc the a of the abc ccc dd on aaa 28 abc 19 "
print(len(nltk.word_tokenize(en)))
输出:
15
答案 5 :(得分:0)
查看collections.Counter文档中的介绍性示例。这表明如何在句子中找到单个单词。