如何在Python列表中使用星号通配符搜索药品条目?
实现Tkinter药品列表的星号通配符搜索功能
核心思路
把用户输入的星号通配符转成正则表达式,用re模块实现模糊匹配:
- 星号
*替换为正则中的.*(匹配任意长度的任意字符) - 转义用户输入里的正则特殊字符(比如
.、+等),避免干扰匹配逻辑
关键代码实现
1. 通配符转正则的工具函数
import re import tkinter as tk def wildcard_to_regex(pattern): # 先转义所有正则特殊字符,再把转义后的\*替换成.* escaped_pattern = re.escape(pattern) return escaped_pattern.replace(r'\*', '.*')
2. 修改搜索逻辑
替换原来的子串匹配,改用正则匹配:
def update_medicine_list(): search_input = search_entry.get().strip() # 清空列表框 medicine_listbox.delete(0, tk.END) if not search_input: # 输入为空时显示所有药品 for med in all_medicines: medicine_listbox.insert(tk.END, med) return # 转换通配符为正则,忽略大小写 regex = re.compile(wildcard_to_regex(search_input), re.IGNORECASE) # 筛选匹配的药品 matched_meds = [med for med in all_medicines if regex.search(med)] # 插入匹配结果 for med in matched_meds: medicine_listbox.insert(tk.END, med)
3. 完整Tkinter示例代码
import re import tkinter as tk from tkinter import ttk # 模拟药品数据 all_medicines = [ "Augmentin Susp", "Amoxicillin Caps", "Paracetamol Tab", "Azithromycin Susp", "Metformin XR Tab" ] def wildcard_to_regex(pattern): escaped_pattern = re.escape(pattern) return escaped_pattern.replace(r'\*', '.*') def update_medicine_list(): search_input = search_entry.get().strip() medicine_listbox.delete(0, tk.END) if not search_input: for med in all_medicines: medicine_listbox.insert(tk.END, med) return regex = re.compile(wildcard_to_regex(search_input), re.IGNORECASE) matched_meds = [med for med in all_medicines if regex.search(med)] for med in matched_meds: medicine_listbox.insert(tk.END, med) # 创建主窗口 root = tk.Tk() root.title("药品搜索") root.geometry("400x300") # 搜索框 search_frame = ttk.Frame(root, padding=10) search_frame.pack(fill=tk.X) search_label = ttk.Label(search_frame, text="搜索(支持*通配符):") search_label.pack(side=tk.LEFT) search_entry = ttk.Entry(search_frame) search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5) # 绑定回车触发搜索 search_entry.bind("<Return>", lambda e: update_medicine_list()) search_btn = ttk.Button(search_frame, text="搜索", command=update_medicine_list) search_btn.pack(side=tk.RIGHT) # 药品列表框 medicine_listbox = tk.Listbox(root, width=50, height=15) medicine_listbox.pack(fill=tk.BOTH, expand=True, padx=10, pady=5) # 初始化显示所有药品 update_medicine_list() root.mainloop()
说明
- 输入
a*u*g*t*n*时,会匹配包含a、u、g、t、n这些字符(顺序一致,中间可夹任意内容)的药品,比如Augmentin Susp re.IGNORECASE让搜索不区分大小写,输入小写也能匹配大写开头的药品名re.escape确保用户输入的特殊字符(比如.)被当作普通字符处理,不会触发正则语法
内容的提问来源于stack exchange,提问作者Alaa ebrahim
相关产品推荐
相关产品推荐

