
目的:从该excel文件的E列中的大批文字中筛选出来cveID。
思路:编辑excel文件需要先打开它,即需要用到xlrd;写入excel需要用到xlwt;在E列中匹配cveID的规则需要用到正则表达式,即需引用re。
一、首先在cmd中下载安装相应的包
pip install xlrd
pip install xlwt
re与urllib是python的内置库,不需要单独安装
检查一下 pip list

完成
二、写代码
1、首先把要编辑的excel读出来
```
import xlrd
data = xlrd.open_workbook(r"E:\知识库平台\results.xls")
table = data.sheets()[0]
table2 = data.sheet_by_index(0)
table3=data.sheet_by_name(u'通告')
```
测试一下:

2、再读取所需的数据
text = table.cell_value(1,4) 即读取第1行第4列的数据
print(text)测试一下:

数据太长,被折叠了,显示已经成功输出了
3、处理获取的原数据,利用正则表达式匹配所需的数据,即cveID。
分析一下,cveID都是"CVE-****-****"这样的格式
import re
cveNum = re.findall(r"CVE-(.{1,5}-.{1,5})",text)
print(cveNum)测试一下:

但是我只想要第一个值,后面的有些是重复的,有些是文本中提到的其他的ID。
就只取cveNum的第一个值,cveNum[0]

4、遍历excel的每一行,依次筛选出cveID
首先就要获得excel一共有多少行,再遍历每一行并输出cveID
nrows = table.nrows
for a in range(nrows):
text = table.cell_value(a,4)
print(text)
cveNum = re.findall(r"CVE-(.{1,5}-.{1,5})",text)
print(cveNum[0])
运行一下,发现报错了。是因为并不是每一行的原数据中都有cveID,有的没有匹配到,所以相应的cveNum列表就为空。

那么加一个判断cveNum是否为空的判断就好了
if len(cveNum):
print(cveNum[0])
else:
print("no cveID")

成功
5、最后只需要把数据写入列表就行了,写入的时候把“cve-”这个前缀加上
import xlwt
workbook = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = workbook.add_sheet('test', cell_overwrite_ok=True)
if len(cveNum):
sheet.write(a,4,"CVE-"+str(cveNum[0]))
else:
sheet.write(a,4,"no cveID")
workbook.save(r'E:\知识库平台\test.xls')
结果出来啦

三、问题总结
1、正则表达式的运用
2、判断列表是否为空的方法
if len(list):
pass
else:
pass
如果列表不为空,则长度不为0,值为True。
完整代码:

网友评论