引言
说起字符串分割,我们第一反应会是字符串中的split方法,如果给定了关键词去分割一个字符串,该怎么操作呢?最近写到了一个很有意思的题目,分享给大家:
一、题目描述
题目看起来很简单:
假设有一个字典,其中包括:“大数据”、“互联网”、“技术”、“数据”、“结构化”、“处理”、“难点”、“分析”、“很大”、“合适”、“平台”。
用关键词对输入的句子用进行词汇切分。
例如输入句子是“互联网大数据技术与分析平台”,按关键词分割
输出:互联网/大数据/技术/与/分析/平台。
其他例子如下:
二、题目分析:
这道题看起来不难啊,这个字典其实就是个关键词字符串构成的列表。第一想法是用in关键字,把输入的句子先按两个两个切割,用in的关键字去和列表判断,再三三判断。可是这样有一个问题:比如输入的互联网大数据技术与分析平台,这里的“与”不在列表里面,是要单独分割出来的,如果用in关键字与其他混为一谈就没办法判断了。并且,“大数据”和“数据”应该切分为两个词,即“大数据”不可切分为“大”“数据”。
所以,想到了另一种做法:
1. 先将字符串“互联网大数据技术与分析平台”这个整体与列表匹配,匹配不上的话,删去字符串最右边的字符,变成“互联网大数据技术与分析平”
1. 再去匹配,匹配不上再删去最右边的字符,变成“互联网大数据技术与分析”
1. 再去匹配……不断重复这个过程,直达匹配上“互联网”为止 。
1. 将原字符串减去第一次匹配到的字符串,即“互联网大数据技术与分析平台”减去“互联网”变为“大数据技术与分析”。
1. 得到的结果再进行循环,再进行匹配,并且把每一次的最终匹配结果存在一个列表里面。
1. 缝合列表,输出结果。
这里要注意:以上述例子为例,这里的“也”由于在列表里匹配不到,会报索引的错误,需要捕获异常,这个功能在func_2函数中有所说明。
三、代码
代码如下:
1. import copy 2. dic_list = ["大数据", "互联网", "技术", "数据", "结构化", "处理", "难点", "分析", "很大", "合适", "平台"] 3. str_input = input("请输入一个句子:") 4. str_list = list(str_input) 5. str_input_2 = copy.copy(str_input) 6. fin_list = [] 7. fin_list_2 = [] 8. def func_1(str_input): 9. while True: 10. if len(str_input) != 1: 11. if str_input not in dic_list: 12. str_input = str_input[:-1:1] 13. else: 14. return str_input 15. else: 16. return str_input 17. def func_2(): 18. global str_input 19. while True: 20. try: 21. fin_list_2.append(func_1(str_input)) 22. length = len(func_1(str_input)) 23. str_input = str_input[length::1] 24. if len("".join(fin_list_2)) == len(str_input_2): 25. break 26. except IndexError: 27. fin_list_2.append(str_input[0]) 28. str_input = str_input.replace(str_input[0],"") 29. if len("".join(fin_list_2)) == len(str_input_2): 30. break 31. fin_str = "/".join(fin_list_2) 32. return fin_str 33. print("原句子是:",str_input_2) 34. print("切分结果是",func_2())
四、输出结果:
五、总结:
1、这里的字典其实就是一个关键词字符串构成的列表。
2、删除字符串最右边一位用字符串的切片方法:str_input = str_input[:-1:1]
3、在输入的字符串删除初步匹配的结果:
length =len(func_1(str_input))
str_input =str_input[length::1]
4、func_1函数的作用是,你只要输入一个句子,他能返回第一个词(如果第一个词不在列表里面,会报索引错误)
5、fun_2函数的作用是,在原来输入的字符串中不断缩减,提取出来关键词,并且捕获异常。捕获异常的关键代码,即把那个字给提取出来:
6、简单来说,func_1算是造了一个工具,func_2一直在调用这个工具,不断产生结果,并且他还有捕获异常的功能。
7、“\”.join(fin_list)将列表缝合起来,返回最终结果。