从EXCEL BOM 描述中提取部分信息---正则表达式使用

从EXCEL BOM描述中提取关键的信息,用于建库填写内容,或者检查BOM等都会用到,如下大概通过两种方式实现信息的提取

1.手动Excel中提取

2.将如上1的方式用python实现,可以实现批量操作,减少操作带来的错误,明显提高干工作效率

目录

1.手动Excel中提取

1. 分列:适用于固定格式

2.ctrl+e快捷键的作用

3.正则表达式

Excel 使用正则表达式

 在线正则表达式测试平台

2.使用Python Openpyxl和RE库实现

案例说明:

从如下这个电阻的BOM信息中,通过描述信息,提取到value和footprint的信息

R0000212片状电阻 Precise SMD resistor厚膜电阻 86.6KΩ ±1% 1/20W SMD 0201(公制0603)RC0201FR-0786K6LYAGEO(国巨)
具体的描述为:
Description = 厚膜电阻 86.6KΩ ±1% 1/20W SMD 0201(公制0603)

提取最终的value为(根据自己的需求) 

value = 86.6K;1%;0201

提取最终的footprint为:

footprint = SR0201

1.手动Excel中提取

想到的Excel操作

1. 分列:适用于固定格式

通过多个数据分析,面试信息虽然有基本相同的格式,但是也不是完全相同,因此不能使用分列完成。

2.ctrl+e快捷键的作用

此操作基本可以完成80%的信息,但是有部分因格式不完全相同会匹配信息不全,而且每次匹配完还需要人工再对一下,再没有更好的办法之前这个是比较好的办法。

3.正则表达式

因Excel本身不带正则表达式,因此使用宏自定义函数,再使用自定义的RE函数执行正则表达式,

注:对于正则表达式,如一次正则不能完全涵盖所有情况,可以使用筛选后多次匹配来完成,另外操作完后对应的列是=RE公式,还需要复制粘贴为文本

4.其它方式

如Access是否也具有提取信息的功能?个人不熟悉

Excel 使用正则表达式

EXCEL中如何使用正则表达式_excel 正则表达式_普通网友的博客-CSDN博客

需要自定义RE函数,然后使用RE函数,这里直接复制如上链接的代码,按SOP操作,不需要懂原理也可以操作。

Function RE(OriText As String, ReRule As String, ReplaceYesOrNo As Boolean)
'''
'OriText:待匹配的字符串
'ReRule:正则表达式
'ReplaceYesOrNo:是否采用替换方法,1表示替换,0表示不替换,默认为不替换
'''
'创建一个正则表达式实例对象
Set ReObject = CreateObject("vbscript.regexp")
 
With ReObject
 
    '是否区分大小写,一般需求是不用区分大小写,因此这里为True
    .IgnoreCase = True
    
    '是否匹配所有,一般需求也都是匹配所有,这里也就默认是True,如果为False表示只匹配第一次出现的
    .Global = True
    
    '匹配时所用到的正则表达式
    .Pattern = ReRule
    
    If ReplaceYesOrNo Then
        
        '如果使用替换方法,则将正则表达式匹配到的项替换为空
        RE = .Replace(OriText, "")
        
    Else
        '否则,返回可迭代对象的第一项
        RE = .Execute(OriText)(0)
    End If
    
End With
End Function

 如上是部分测试;

 在线正则表达式测试平台

正则表达式在线测试 | 菜鸟工具

3个正则表达式在线自动生成器(正则表达式自动生成工具)-老部落

正则语法如下

. - 除换行符以外的所有字符。
^ - 字符串开头。
$ - 字符串结尾。
\d,\w,\s - 匹配数字、字符、空格。
\D,\W,\S - 匹配非数字、非字符、非空格。
[abc] - 匹配 a、b 或 c 中的一个字母。
[a-z] - 匹配 a 到 z 中的一个字母。
[^abc] - 匹配除了 a、b 或 c 中的其他字母。
aa|bb - 匹配 aa 或 bb。
? - 0 次或 1 次匹配。
* - 匹配 0 次或多次。
+ - 匹配 1 次或多次。
{n} - 匹配 n次。
{n,} - 匹配 n次以上。
{m,n} - 最少 m 次,最多 n 次匹配。
(expr) - 捕获 expr 子模式,以 \1 使用它。
(?:expr) - 忽略捕获的子模式。
(?=expr) - 正向预查模式 expr。
(?!expr) - 负向预查模式 expr。

也可以使用python openpyxl操作excel,使用Python re正则表达式完成操作

2.使用Python Openpyxl和RE库实现

实现如上1的全部操作

需要具备一点python基础,主要使用的库就是openpyxl和re

re 匹配模式可以提前在线测试好,使用python的好处是替换,查找等文本操作全部可以用程序完成,且可以做到批量处理,经过两个多小时的努力测试,基本完成要求!

 如下是处理电阻最主要的几个函数,可以看到基本是把手工操作全部用代码实现了。

    #修改电阻value的内容
    def modifyValue(self,value):
        # 去掉空格
        value = value.replace(" ", "")
        #mΩ电阻使用mR标识
        if 'mΩ' in value:
            value = value.replace("mΩ","mR")
        # 去掉Ω
        value = value.replace("Ω", "")
        # 去掉±
        value = value.replace("±", ";")
        # 去掉SMD
        value = value.replace("SMD", ";")
        print(value)
        return value
    #向Excel特定cell写入值
    def writeValue(self,row,col,value):
        # 写入对应的value 列
        logging.info('向Excel中写入value {}'.format(value))
        self.sheet.cell(row, col, value)
    
def setResValue(self,strValue):
        column = self.getCellColum(strValue)
        valueCol = self.getCellColum('Value')
        print(valueCol)
        #遍历打印每行的描述
        logging.info('excel sheet is  {}'.format(self.sheet))
        for row in range(2,self.sheet.max_row + 1):
            descrip = self.sheet.cell(row,column).value
            print(descrip)
            #处理电阻描述的正则表达
            valuePattern = re.compile(r'(\d+([.]\d+)?)\w?[Ω]\s?[±](\d+([.]\d+)?)[%]')
            packagePattern = re.compile(r'SMD\s\d+')
            valueMo = valuePattern.search(descrip)
            packageMo =packagePattern.search(descrip)
            if valueMo is not None:
                #如匹配成功处理完后写入对应的excel 列
                value = valueMo.group() + packageMo.group()
                value = self.modifyValue(value)
                self.writeValue(row,valueCol,value)

总结:

如上内容的核心还是正则表达式

1.对于正则表达式一开始不熟悉,可以使用在线测试,尤其在线测试中有可视化工具 ,很快就可以完成表达式,是不是也有自动生产正则表达式的工具,比如我开头举得栗子作为输入,是否可以直接产生正则表达式?目前还没找到,如有这种工具,还望友友们推荐。

2.如上提到的python操作excel,主要用的就是读取和写入内容,没有多少工作量,剩余的基本都是文本操作,比如查找替换等

正则的学习,如下这个工具也基本够用

正则表达式可视化工具 | 菜鸟工具

<think>好的,我现在需要帮助用户解决如何利用DeepSeek快速统计CATIA装配图中的采购件、标准件和国标件,并生成清单的问题。首先,我需要理解用户的需求。他们可能是在进行BOM管理或者成本估算,需要自动化工具来分类零件,节省手动统计的时间。 接下来,我应该考虑CATIA本身的功能。CATIA有Product Structure模块,可能可以导出结构信息,但用户提到的是利用DeepSeek,这可能是一个特定的工具或他们可能指的是深度求索(DeepSeek)公司的AI产品。不过目前公开信息中,DeepSeek主要提供AI模型,可能与CATIA集成不直接相关。这里可能需要确认用户是否指的是某种集成工具,或者他们希望用AI辅助处理CATIA数据。假设用户想结合CATIA的API和AI技术,比如用脚本提取数据后用AI分类。 然后,我需要分析CATIA的API。CATIA支持VBA和Automation接口,可以通过脚本遍历装配结构,提取零件属性。用户需要分类采购件、标准件和国标件,这些信息可能存储在零件的属性中,如“PartType”或自定义属性。所以第一步是提取这些属性。 如果属性中没有明确分类,可能需要基于零件名称或编号进行模式匹配。例如,标准件可能有特定的编号前缀,如GB开头为国标件。这时候需要编写正则表达式来识别。不过,如果命名不规范,可能需要更复杂的方法,比如自然语言处理,这时候可以引入AI模型,比如训练一个分类模型,根据零件名称和描述判断类别。但实际实施可能需要大量标注数据和模型训练,对于用户来说可能比较复杂,所以可能需要先检查现有属性是否可用。 然后,生成清单的步骤相对直接,可以用脚本将提取信息输出到Excel或CSV文件。需要考虑清单的格式,包括零件名称、编号、类型、数量等。 用户可能遇到的挑战包括:零件属性不统一、命名不规范、分类标准不明确。解决方案可能需要预处理数据,或者结合多种方法,如属性提取加关键词匹配,甚至简单AI模型分类。 另外,用户可能希望自动化整个过程,所以需要编写脚本来自动执行这些步骤,可能还需要处理大型装配体的性能问题。 总结步骤应该是:1. 遍历装配结构,提取零件信息;2. 根据属性或名称分类;3. 汇总生成清单。如果属性缺失,可能需要其他方法。最后导出为Excel。 可能还需要考虑如何处理子装配体,确保递归遍历所有层级。同时,确保脚本的效率,避免在处理大型装配时卡顿。 最后,提供代码示例会有帮助,比如使用CATIA VBA脚本,并说明如何修改以适应不同的属性设置。同时,提醒用户确保属性正确填写,或者建议使用AI工具辅助分类,如果有数据不规范的情况。</think>在CATIA中实现自动化零件统计需要结合VBA脚本和零件属性管理,以下是具体实现方案: 一、技术路线 1. 基于CATIA CAA V5 Automation接口开发 2. 采用特征识别+属性过滤双重验证 3. 集成正则表达式匹配国家标准编号(如GB/T 5782-2023) 二、实现步骤 1. 装配树遍历模块 ```vbnet Sub GetAllComponents(oProduct As Product, ByRef dict As Object) Dim oProd As Product For Each oProd In oProduct.Products If oProd.ReferenceProduct.IsStandard Then dict("标准件") = dict("标准件") + 1 ElseIf InStr(1, oProd.PartNumber, "GB") > 0 Then dict("国标件") = dict("国标件") + 1 Else dict("采购件") = dict("采购件") + 1 End If GetAllComponents oProd, dict Next End Sub ``` 2. 智能分类模块(正则表达式示例) ```vbnet Function ClassifyPart(part As Product) Dim sPN As String sPN = part.PartNumber 'GB标准件识别 If RegExpTest(sPN, "GB\/T?\s?\d{4,5}-\d{4}") Then ClassifyPart = "国标件" ElseIf part.GetAttribute("VendorCode") <> "" Then ClassifyPart = "采购件" Else ClassifyPart = "标准件" End If End Function ``` 三、增强功能实现 1. 三维几何特征验证 ```vbnet Sub CheckStandardFeature(part As Part) Dim oHole As Hole For Each oHole In part.Holes If Not IsStandardHole(oHole.Diameter) Then AddToErrorLog "非标孔:" & part.Name End If Next End Sub ``` 四、清单生成优化 1. 多维度输出控制 ```vbnet Sub GenerateReport(dict As Object) Set oExcel = CreateObject("Excel.Application") oExcel.Workbooks.Add With oExcel.ActiveSheet .Cells(1, 1) = "零件类别" .Cells(1, 2) = "数量" .Cells(2, 1).Resize(3, 1) = Application.Transpose(dict.Keys) .Cells(2, 2).Resize(3, 1) = Application.Transpose(dict.Items) .ListObjects.Add(xlSrcRange, .Range("A1:B4"), , xlYes).Name = "PartsTable" End With End Sub ``` 五、执行效果提升技巧 1. 缓存机制加速遍历 ```vbnet Dim oCache As New Dictionary If Not oCache.Exists(part.PartNumber) Then oCache.Add part.PartNumber, ClassifyPart(part) End If ``` 六、部署建议 1. 创建自定义工具条按钮 ```xml <CATRsc id="QC_Toolbar"> <Panel id="QC_Panel"> <Button id="GenPartsList" Command="GeneratePartsList" LargeIcon="QC_32.ico" Tooltip="生成零件分类清单"/> </Panel> </CATRsc> ``` 七、注意事项 1. 预处理要求: - 确保所有零件已正确设置"采购类型"属性 - 标准件必须关联CATIA标准件库 - 国标件编号需符合GB/T命名规范 2. 性能优化: - 对超过1000个零件的装配体启用延迟加载 - 采用多线程处理子装配体 - 设置内存缓存避免重复计算 完整解决方案包含: - 属性管理规范文档(含GB/T对照表) - 异常零件处理流程 - 与ERP系统对接接口 - 版本控制模块 是否需要提供特定企业标准的定制开发方案?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值