如何遍历字母表依次运行单词搜索函数并生成各字母独立结果文件
问题描述
- 已实现功能:编写了可在文本中搜索所有以指定字母开头的5字母单词的函数,处理完成后会将结果列表存入对应文本文件。
- 待解决需求:当前代码需要手动修改首字母参数、逐次运行程序才能处理不同字母,需要调整代码实现按顺序遍历字母表所有字母自动执行搜索,为每个首字母的搜索结果生成独立的文本文件。
原有代码
import re from pathlib import Path # define starting letter of word search ltr = 'm' # define RegEx pattern to find all 5-letter words starting with a certain letter pattern = r'\b'+ltr+r'\w{4}\b' # define Function WordSearch: search wordlist.txt with defined RegEx Pattern def WordSearch(): # set Path to Main Text file file = r'C:\Users\User1\OneDrive\Documents\wordlist.txt' # open Main Text file and set variable 'MainText' equal to contents fileToOpen = Path(file) f = open(fileToOpen) MainText = f.read() # search all words in Main Text and make list of those that fit the # RegEx pattern defined above slist = re.findall(pattern,MainText) # make set from list to eliminate duplicate entries slist_nd = list(set(slist)) # turn Set into a string sliststr = ' '.join(slist_nd) # open new txt file, write string into contents slist_file = open(r"C:\Users\User1\OneDrive\Documents\fivelist"+ltr+".txt", "w") slist_file.write(sliststr) # close files f.close() slist_file.close() WordSearch()
修改方案
核心调整逻辑:
- 把写死的首字母、正则规则改为函数动态入参,支持传入任意首字母生成对应匹配规则
- 将源词库的文件读取逻辑移到循环外部,26次搜索仅需读取1次源文件,减少不必要的IO开销
- 引入
string模块直接获取a-z完整字母序列,无需手动拼写字母表 - 用
with上下文管理器处理文件读写,自动完成文件关闭操作,避免资源泄漏
修改后可直接运行的完整代码:
import re import string from pathlib import Path def word_search(start_letter: str, main_text: str) -> None: # 动态生成对应首字母的正则匹配规则 pattern = rf'\b{start_letter}\w{{4}}\b' # 提取所有符合规则的单词 match_words = re.findall(pattern, main_text) # 去重后拼接为字符串 unique_words = list(set(match_words)) result_content = ' '.join(unique_words) # 写入对应首字母的独立结果文件 output_file = Path(r'C:\Users\User1\OneDrive\Documents') / f'fivelist{start_letter}.txt' with open(output_file, 'w', encoding='utf-8') as f: f.write(result_content) if __name__ == '__main__': # 提前读取一次词库源文件 source_file = Path(r'C:\Users\User1\OneDrive\Documents\wordlist.txt') with open(source_file, 'r', encoding='utf-8') as f: word_list_content = f.read() # 遍历a-z所有字母依次执行搜索 for letter in string.ascii_lowercase: word_search(letter, word_list_content)
补充说明
- 如果需要同时匹配大写首字母的单词,可以在
re.findall中加入flags=re.IGNORECASE参数忽略大小写 - 如果需要按字母顺序排序结果,可以在去重后加一行
unique_words.sort()再拼接字符串 - 所有结果文件会按照
fivelista.txt、fivelistb.txt……fivelistz.txt的规则命名,和原有命名逻辑保持一致
内容的提问来源于stack exchange,提问作者Ryan Ponsell
相关产品推荐
相关产品推荐

