如何分割纯英文单词

如何分割纯英文单词

假如有一段英文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同行”:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值