Python正则匹配产品至对应Work Center的代码优化求助
问题分析
你的代码存在两个核心问题导致匹配失败:
- 匹配逻辑错误:原代码用严格相等判断
group == row['Type_group'].replace('*', ''),但规则是前缀匹配(比如KA*要匹配所有以KA开头的产品组,而非仅等于KA的组);尺寸匹配同理,不能用严格相等。 - 规则优先级未处理:如果先匹配到短前缀规则(比如
K*),会导致更长的精确前缀(比如KA*)无法触发,出现错误匹配。
修改后的代码
import pandas as pd import re # 读取数据 df_products = pd.read_excel('orders_table.xlsx') df_rules = pd.read_excel('products_work_centers.xlsx') # 预处理规则:去除*,并按Type_group长度降序排序(确保长前缀规则优先匹配) df_rules['group_prefix'] = df_rules['Type_group'].str.replace('*', '') df_rules['size_prefix'] = df_rules['Type_size'].str.replace('*', '') df_rules = df_rules.sort_values(by='group_prefix', key=lambda x: x.str.len(), ascending=False) def match_workcenter(prodotto): # 提取产品组(开头所有大写字母)和尺寸(紧跟的数字序列) match = re.match(r"^([A-Z]+)(\d+)", prodotto) if not match: return None prod_group, prod_size = match.groups() # 遍历规则,找到第一个匹配的前缀规则 for _, row in df_rules.iterrows(): # 检查产品组是否以规则前缀开头,尺寸是否以规则尺寸前缀开头 if prod_group.startswith(row['group_prefix']) and prod_size.startswith(row['size_prefix']): return row['Workcenter'] return None # 应用匹配函数 df_products['WorkCenter'] = df_products['Prodotto'].apply(match_workcenter) print(df_products)
关键改进点
- 前缀匹配逻辑:用
startswith()替代严格相等,完美契合规则中的*前缀匹配要求,比如KA*能匹配KAZ、KA等所有以KA开头的产品组。 - 规则优先级排序:将规则按
group_prefix长度降序排列,确保更长、更精确的前缀规则(如KA*)先被匹配,避免被短前缀规则(如K*)提前拦截。 - 鲁棒的正则提取:用
^([A-Z]+)(\d+)确保从产品名称开头提取字母组和数字尺寸,不受后续无关字符干扰。
测试验证
针对你提到的WAF20、WA20、KAZ67这类产品:
- 如果规则中有
WA*+20*,则WAF20和WA20会正确匹配对应的Work Center; KAZ67会匹配规则中KA*+67*(或对应尺寸前缀)的Work Center。
内容的提问来源于stack exchange,提问作者spolale
相关产品推荐
相关产品推荐

