如何更高效实现匹配指定字符组合的文本单词提取函数?
优化特定字符组合的单词筛选函数
嘿,我来帮你优化这段代码!你的需求是从输入文本里筛选出包含tion、ex、ph、ost、ist、ast这些字符组合的单词,当前的for循环写法不仅重复度高,还可能把同一个单词多次添加到结果列表里(比如同时包含ex和tion的explanation,会被append两次),我们可以用更简洁高效的方式来实现。
方法一:正则表达式(推荐,适合复杂匹配)
正则表达式天生擅长处理这种多模式匹配的场景,而且能一次性完成所有规则的检查,还能轻松处理单词边界、大小写等细节:
import re def filter_words(text): # 预编译正则模式,用非捕获组定义所有目标字符组合 # \b 确保匹配完整单词,re.IGNORECASE 忽略大小写(可选) pattern = re.compile(r'\b\w*(?:tion|ex|ph|ost|ist|ast)\w*\b', re.IGNORECASE) # 提取所有匹配的单词 matches = pattern.findall(text) # 去重后返回列表 return list(set(matches))
代码说明:
re.compile预编译正则表达式,提升多次调用函数时的效率(?:...)是非捕获组,让findall返回完整的匹配单词,而不是只返回匹配的字符片段\b是单词边界,确保我们匹配的是完整单词(不会漏掉prefix里的ex这类情况,符合你的需求)re.IGNORECASE可以匹配大小写不同的版本(比如Tion、EX),不需要的话可以直接去掉- 用
set去重,确保同一个单词只会出现在结果里一次
方法二:用集合+any()(轻量无依赖)
如果不想引入正则模块,也可以把目标字符组合放到集合里,结合any()函数来简化判断,同时解决重复添加的问题:
def filter_words(text): # 把目标字符组合存到集合中,查找效率更高 target_patterns = {"tion", "ex", "ph", "ost", "ist", "ast"} words = text.split() # 集合推导式自动去重,只要单词包含任一目标组合就保留 return list({word for word in words if any(pattern in word for pattern in target_patterns)})
代码说明:
- 集合
target_patterns的成员查找速度比列表快,数据量大时优势更明显 any(pattern in word for pattern in target_patterns)会逐个检查单词是否包含任一目标组合,只要有一个满足就返回True- 集合推导式
{word for ...}自动帮我们去重,最后转成列表返回
对比你原来的代码,这两种方法都解决了重复添加单词的问题,代码更简洁易读,维护起来也更方便——以后要加新的字符组合,只需要修改正则里的模式或者集合里的元素就行啦!
内容的提问来源于stack exchange,提问作者user14152659
相关产品推荐
相关产品推荐

