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

求助:如何用正则表达式修正产品单位大小写并实现单位与数字粘连?

正则表达式标准化产品单位格式问题

我在处理产品数据的单位标准化时遇到了问题,数据包含类似2L cans、500mL cans、1.5Kg box(法语格式如bidon de 2L)的条目,目标是:

  • 将单位中的L和K大写,其余字母小写(例如ml转为mL)
  • 让单位与前置数字紧密粘连(去除中间空格)

现有代码无法实现ml转mL,部分单位也未正确转换,以下是我的代码、数据示例、当前运行结果及期望结果:

原代码

import pandas as pd
import re

data = {
    'product': [
        'le paquet de 3,315 Kg',
        'les 4 bidons de 3,01L',
        'la recharge de 999 ml',
        'le paquet de 4,87kg',
        'les 2 bidons de 2,63l',
        'la recharge de 1,8 l',
        'les 3 bidons de 1,75 L'
    ]
}

df = pd.DataFrame(data)

pattern = r"(\d+(?:,\d+)?)\s*(\b[a-zA-Z]+\b)$"

def correct_unit(match):
    number = match.group(1)
    unit = match.group(2)
    unit = re.sub(r'\b([kl])([g])?\b', lambda m: m.group(1).upper() + (m.group(2).lower() if m.group(2) else ''), unit, flags=re.IGNORECASE)
    #unit = re.sub(r'ml', 'mL', unit, flags=re.IGNORECASE)
    #unit = re.sub(r'cl', 'cL', unit, flags=re.IGNORECASE)
    return number + unit

df['product'] = df['product'].str.replace(pattern, correct_unit, regex=True)

print(df['product'])

当前运行结果

0 le paquet de 3,315Kg

1 les 4 bidons de 3,01L

2 la recharge de 999ml

3 le paquet de 4,87kg

4 les 2 bidons de 2,63l

5 la recharge de 1,8L

6 les 3 bidons de 1,75L

期望结果

0 le paquet de 3,315Kg

1 les 4 bidons de 3,01L

2 la recharge de 999mL

3 le paquet de 4,87Kg

4 les 2 bidons de 2,63L

5 la recharge de 1,8L

6 les 3 bidons de 1,75L


解决方案

问题出在正则匹配范围限制和单位转换逻辑不够清晰,以下是优化后的代码:

修改后的代码

import pandas as pd
import re

data = {
    'product': [
        'le paquet de 3,315 Kg',
        'les 4 bidons de 3,01L',
        'la recharge de 999 ml',
        'le paquet de 4,87kg',
        'les 2 bidons de 2,63l',
        'la recharge de 1,8 l',
        'les 3 bidons de 1,75 L'
    ]
}

df = pd.DataFrame(data)

# 调整正则:匹配数字(含逗号小数)+ 可选空格 + 单位,支持单位在行中或行尾
pattern = r"(\d+(?:,\d+)?)\s*([a-zA-Z]+)(?=\s|$)"

def correct_unit(match):
    number = match.group(1)
    unit = match.group(2).lower()  # 先统一转为小写,避免大小写混乱
    
    # 按规则标准化单位
    if unit == 'ml':
        unit = 'mL'
    elif unit == 'l':
        unit = 'L'
    elif unit == 'kg':
        unit = 'Kg'
    # 可扩展其他单位:比如 cl -> cL
    # elif unit == 'cl':
    #     unit = 'cL'
    
    return number + unit

df['product'] = df['product'].str.replace(pattern, correct_unit, regex=True)

print(df['product'])

关键优化点

  1. 正则表达式调整:

    • 移除行尾锚定$,改用正向预查(?=\s|$),让单位无论是在行尾还是行中(后跟空格)都能被匹配,适用性更广。
    • 保留对带逗号小数的数字匹配,符合法语地区数字格式。
  2. 单位转换逻辑简化:

    • 先将单位统一转为小写,避免处理各种大小写组合的复杂情况。
    • 针对每个目标单位单独制定转换规则,逻辑清晰,可快速扩展其他单位(如cl转cL只需新增分支)。

运行结果

执行后完全符合期望:

0 le paquet de 3,315Kg
1 les 4 bidons de 3,01L
2 la recharge de 999mL
3 le paquet de 4,87Kg
4 les 2 bidons de 2,63L
5 la recharge de 1,8L
6 les 3 bidons de 1,75L


内容的提问来源于stack exchange,提问作者Antgrd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:24:51