我有一个名为 MAT_DESC 的列表,其中包含自由文本格式的材料描述。以下是 MAT_DESC 列中的一些示例值:
QWERTYUI PN-DR, Coarse, TR, 1-1/2 in, 50/Carton, 200 ea/Case, Dispenser Pack
2841 PC GREY AS/AF (20/CASE)
CI-1A, up to 35 kV, Compact/Solid, Stranded, 10/Case
MT53H7A4410WS5 WS WEREDSS PMR45678 ERTYUI HEERTYUIND 10/case
TYPE.2 86421-K40-F000, 1 Set/Pack, 100 Packs/Case
Clear, 1 in x 36 yd, 4.8 mil, 24 rolls per case
3M™ Victory Series™ Bracket MBT™ 017-873, .022, UL3, 0T/8A, Hk, 5/Pack
3M™ BX™ Dual Reader Protective Eyewear 11458-00000-20, Clear Anti-Fog Lens, Silver/Black Frame, +2.0 Top/Bottom Diopter, 20 ea/Case
4220VDS-QCSHC/900-000/A CABINET EMPTY
3M™ Bumpon™ Protective Product SJ5476 Fluorescent Yellow, 3.000/Case
3M™ Bumpon™ Protective Products SJ61A2 Black, 10,000/Case
材质说明 | 要提取的字符串 |
---|---|
QWERTYUI PN-DR,粗粒,TR,1-1/2 英寸,50 个/箱,200 个/箱,分配器包装 | 50个/箱,200个/箱 |
2841 PC 灰色 AS/AF (20/箱) | 20/箱 |
TYPE.2 86421-K40-F000,1套/包,100包/箱 | 1 套/包,100 包/箱 |
RTYU 31655,240+,6 英寸,50 盘/卷,6 卷/箱 | 50 片/卷,6 卷/箱 |
透明,1 英寸 x 36 码,480 万,每箱 24 卷 | 每箱24卷 |
3M™胜利系列™支架MBT™017-873, .022, UL3, 0T/8A, Hk, 5/包 | 5/包 |
3M™ BX™ 双阅读器防护眼镜 11458-00000-20,透明防雾镜片,银色/黑色镜框,+2.0 顶部/底部屈光度,20 片/盒 | 20个/箱 |
4220VDS-QCSHC/900-000/A 空柜 | 没有单位 |
3M™ Bumpon™ 防护产品 SJ5476 荧光黄,3.000/箱 | 3.000/箱 |
3M™ Bumpon™ 防护产品 SJ61A2 黑色,10,000 个/箱 | 10,000/箱 |
我正在尝试从 MAT_DESC 列中提取子字符串的特定模式,例如数量和单位信息(例如“50 光盘/卷”、“200 ea/箱”、“10/箱”、50/箱) 200 件/箱等)。 我目前正在使用以下 PYTHON 来尝试此操作:
pattern = r"(\d+)\s*(\w+)/(\w+)"
results = []
for desc in material_descriptions:
matches = re.findall(pattern, desc)
unit_strings = []
if matches:
for match in matches:
quantity, unit1, unit2 = match
unit_string = f"{quantity} {unit1}/{unit2}"
unit_strings.append(unit_string)
if unit_strings:
unit_info = ", ".join(unit_strings)
results.append((desc, unit_info))
for material_desc, unit_info in results:
print(f"Material Description: {material_desc}")
print(f"Unit Information: {unit_info}")
print()
Python 脚本在下面列出的场景中失败
材质说明 | 要提取的字符串 |
---|---|
3M™胜利系列™支架MBT™017-873, .022, UL3, 0T/8A, Hk, 5/包 | 5/包 |
3M™ BX™ 双阅读器防护眼镜 11458-00000-20,透明防雾镜片,银色/黑色镜框,+2.0 顶部/底部屈光度,20 片/盒 | 20个/箱 |
4220VDS-QCSHC/900-000/A 空柜 | 没有单位 |
3M™ Bumpon™ 防护产品 SJ5476 荧光黄,3.000/箱 | 3.000/箱 |
3M™ Bumpon™ 防护产品 SJ61A2 黑色,10,000 个/箱 | 10,000/箱 |
有办法实现这个目标吗?
对于您共享的数据,我建议使用
\b(?<!\d[,.])(?<!\d-)((?:\d+/)?\d+(?:[,.]\d+)*)\b(\s*(\w*)/)?\s*((?(2)\w+|\w+\s+per\s+\w+))(?=\s*(?:[,)]|$))
请参阅正则表达式演示。在您的代码中,由于正则表达式现在包含 4 个组,因此您需要使用
quantity, _, unit1, unit2 = match
只是为了跳过此正则表达式中技术性的第 2 组值。
正则表达式详细信息:
\b
- 单词边界(?<!\d[,.-])
- 当前位置之前不应有数字 + ,
、.
或 -
((?:\d+/)?\d+(?:[,.]\d+)*)
- 第 1 组:可选组,由一位或多位数字组成,然后是 /
,然后是一位或多位数字,然后零次或多次重复 ,
或 -
以及一位或多位数字\b
- 单词边界(\s*(\w*)/)?
- 第 2 组(可选):零个或多个空格,然后是零个或多个单词字符(捕获到第 3 组)和一个 /
字符\s*
- 零个或多个空格((?(2)\w+|\w+\s+per\s+\w+))
- 第 4 组:如果第 2 组匹配,则匹配一个或多个单词字符,否则,一个或多个单词 + 一个或多个空格,per
+ 一个或多个空格,一个或多个单词字符(?=\s*(?:[,)]|$))
- 正向前瞻需要(紧邻当前位置的右侧)零个或多个空格,然后是 ,
或 )
或字符串末尾。