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

Python正则匹配产品至对应Work Center的代码优化求助

问题分析

你的代码存在两个核心问题导致匹配失败:

  1. 匹配逻辑错误:原代码用严格相等判断group == row['Type_group'].replace('*', ''),但规则是前缀匹配(比如KA*要匹配所有以KA开头的产品组,而非仅等于KA的组);尺寸匹配同理,不能用严格相等。
  2. 规则优先级未处理:如果先匹配到短前缀规则(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:00:54