从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-0786K6L | YAGEO(国巨) |
具体的描述为: 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 = ReRuleIf ReplaceYesOrNo Then'如果使用替换方法,则将正则表达式匹配到的项替换为空RE = .Replace(OriText, "")Else'否则,返回可迭代对象的第一项RE = .Execute(OriText)(0)End IfEnd 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("±", ";")# 去掉SMDvalue = 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).valueprint(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,主要用的就是读取和写入内容,没有多少工作量,剩余的基本都是文本操作,比如查找替换等
正则的学习,如下这个工具也基本够用
正则表达式可视化工具 | 菜鸟工具