求助:如何用正则表达式修正产品单位大小写并实现单位与数字粘连?
我在处理产品数据的单位标准化时遇到了问题,数据包含类似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'])
关键优化点
正则表达式调整:
- 移除行尾锚定
$,改用正向预查(?=\s|$),让单位无论是在行尾还是行中(后跟空格)都能被匹配,适用性更广。 - 保留对带逗号小数的数字匹配,符合法语地区数字格式。
- 移除行尾锚定
单位转换逻辑简化:
- 先将单位统一转为小写,避免处理各种大小写组合的复杂情况。
- 针对每个目标单位单独制定转换规则,逻辑清晰,可快速扩展其他单位(如
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

