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

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

从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-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,主要用的就是读取和写入内容,没有多少工作量,剩余的基本都是文本操作,比如查找替换等

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

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