Duk*_*uke 2 python string replace
我正在尝试计算字符串中的单词数.但是,我首先必须删除一些标点符号,例如
line = "i want you , to know , my name . "
Run Code Online (Sandbox Code Playgroud)
赛跑
en = line.translate(string.maketrans('', ''), '!,.?')
Run Code Online (Sandbox Code Playgroud)
产生
en = "i want you  to know  my name  "
Run Code Online (Sandbox Code Playgroud)
在此之后,我想计算一行中的单词数.但是当我做len(en)时,我得到30而不是7.
在en上使用split来标记化并找到长度并不适用于所有情况.例如
我试过它并不总是有效.例如考虑这个字符串.
"i ccc bcc the a of the abc ccc dd on aaa , 28 abc 19 ."
Run Code Online (Sandbox Code Playgroud)
然后成为:
"i ccc bcc the a of the abc ccc dd on aaa 28 abc 19 "
Run Code Online (Sandbox Code Playgroud)
但len(en)返回17而不是15.
你能帮忙吗?谢谢
Mar*_*ers 11
问题en.split(' ')是你的字符串中有额外的空格,这会给出空的匹配.你可以通过调用en.split()来轻松解决这个问题.
但也许您可以使用正则表达式使用这种不同的方法(现在不需要首先删除标点符号):
import re
print len(re.findall(r'\w+', line))
Run Code Online (Sandbox Code Playgroud)
看到它在线工作:ideone
您可以使用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)))
Run Code Online (Sandbox Code Playgroud)
输出:
15
Run Code Online (Sandbox Code Playgroud)
        而不是使用正则表达式,\w+它\b用于计算单词更快,如下所示:
import re
_re_word_boundaries = re.compile(r'\b')
def num_words(line):
    return len(_re_word_boundaries.findall(line)) >> 1
Run Code Online (Sandbox Code Playgroud)
请注意,我们必须将数字减半,因为\b在单词的开头和结尾都有匹配.不幸的是,与egrep不同,Python不支持仅在开头或结尾进行匹配.
如果你有很长的行并关心内存,使用迭代器可能是一个更好的解决方案:
def num_words(line):
    return sum(1 for word in _re_word_boundaries.finditer(line)) >> 1
Run Code Online (Sandbox Code Playgroud)