You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:39:18