如何分割纯英文单词
假如有一段英文I'm a boy with passion of writing code.
,现在让你写一个程序来统计这句话有几个单词,每个单词是什么,你会怎么做呢?让我猜一猜,有些人应该会使用字符串的split
方法,比如sentence = '...', split_words = sentence.split(' ')
,这样分割貌似做到了大部分分解的要求,但是这种方法有很多问题,因为英文字符串的分割并不是总用空格分割的,比如用,
分割单词或者其他符号分割,那你又该怎么办呢?
所以,用split
分割单词并不能每次都正确。要找到一个正确的方法就要明白一个单词的构成,一个英文单词包含26个英文字母,大小写不限,其中可能含有'
和-
,单词两边会碰到多个分割符,这些分割符总结一下有' '、','、'.'、'!'、'?'、':'、'"'、';'
。现在让我们再来想一想如何分割单词,给定一句英文,可以一个字符一个字符地判断,字符如果是单词自身构成,那还属于单词范畴,记录下来,字符如果是分割符,那标志这个单词结束,字符如果不属于单词构成和分割符,抛出异常。
源码如下:
""" 分割纯英文字符串为单词
单词集合 [a-z][A-Z][-]
分割符集合 [ ,:;.?!'"]
分辨当前字符的状态来判断单词的所属范围
the statistics of this file:
lines(count) understand_level(h/m/l) classes(count) functions(count) fields(count)
000000000070 ----------------------m 00000000000000 0000000000000001 ~~~~~~~~~~~~2
"""
import time
import string
__author__ = '与C同行'
english_word_set = set(string.ascii_letters+'\'-')
english_separator_set = set(' ,".!?:;')
def split_words(words):
""" 分割给定的字符串为单词
:param words: 给定的字符串
:return: 分割之后的单词列表和单词个数
"""
# 给字符串加一个空格结束标志
words += ' '
split_words_list = []
new_word = ''
for english_chr in words:
if english_chr in english_word_set:
new_word += english_chr
elif english_chr in english_separator_set:
if new_word == '':
pass
else:
split_words_list.append(new_word)
new_word = ''
else:
raise ValueError('字符串中的值超出了判断范围')
return split_words_list, len(split_words_list)
if __name__ == '__main__':
print(f'当前时间:{time.ctime()}')
print()
print('测试第一组字符串:')
first_words = ' I want to say:"hello, you are a beautiful-girl!".'
first_split_word_list, first_words_len = split_words(first_words)
print('first_words分割之后的单词列表:')
print(first_split_word_list)
print(f'first_words分割之后单词个数:{first_words_len}')
print()
print('测试第二组字符串:')
second_words = 'ABCD,EFGHI:JKLMNO;PQRSTUVWXYZ abc\'def"ghijk.lmnopq?rstuv!wxyz -'
second_split_word_list, second_words_len = split_words(second_words)
print('second_words分割之后的单词列表:')
print(second_split_word_list)
print(f'second_words分割之后单词个数:{second_words_len}')
print()
print('测试非规定范围中的字符串,将抛出错误:')
invalid_words = 'I want go 家.'
split_word_list, words_len = split_words(invalid_words)
print('invalid_words分割之后的单词列表:')
print(split_word_list)
print(f'invalid_words分割之后单词个数:{words_len}')
结果如下:
有两点要说一下:第一,该程序用到了标准模块string
,这个模块定义了很多字符集,该程序用到了其中的26个英文字符;第二,这个程序只是按照一定的规则分割英文单词,所以无法识别单词的拼写错误。
喜欢python的朋友可以关注微信公众号“与C同行”: