从包含基本数据描述的文本字段中识别和检索特定的字符序列

问题描述 投票:0回答:1

我有一个名为 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/箱

有办法实现这个目标吗?

python python-3.x regex
1个回答
0
投票

对于您共享的数据,我建议使用

\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*(?:[,)]|$))
    - 正向前瞻需要(紧邻当前位置的右侧)零个或多个空格,然后是
    ,
    )
    或字符串末尾。
© www.soinside.com 2019 - 2024. All rights reserved.