在实际编程应用中,经常需要从一堆文字中提取数值。笔者在爬虫应用中就遇到了这个问题,现找到两种解决方案,供参考!
一些环境准备类的话就不多说了,直接上代码!
将需要的一段文字以字符串的格式赋值给一个变量(string)。
string = "轻型车:共有198家企业4747个车型(12305个信息公开编号)15498915辆车进行了轻型车国六环保信息公开与上周汇总环比增加105个车型、386379辆车。其中,国内生产企业177家、4217个车型、14645390辆,国外生产企业21家、530个车型、853525辆;轻型汽油" # 字符串赋值
num_list = [i for i in string if str.isdigit(i)] # Python isdigit() 方法检测字符串是否只由数字组成。返回True or False.
print(num_list)
打印出来的结果为
[‘1’, ‘9’, ‘8’, ‘4’, ‘7’, ‘4’, ‘7’, ‘1’, ‘2’, ‘3’, ‘0’, ‘5’, ‘1’, ‘5’, ‘4’, ‘9’, ‘8’, ‘9’, ‘1’, ‘5’, ‘1’, ‘0’, ‘5’, ‘3’, ‘8’, ‘6’, ‘3’, ‘7’, ‘9’, ‘1’, ‘7’, ‘7’, ‘4’, ‘2’, ‘1’, ‘7’, ‘1’, ‘4’, ‘6’, ‘4’, ‘5’, ‘3’, ‘9’, ‘0’, ‘2’, ‘1’, ‘5’, ‘3’, ‘0’, ‘8’, ‘5’, ‘3’, ‘5’, ‘2’, ‘5’]。我们发现,数字提取出来了,但是把原来的数值拆分成单个数字。并且仍以字符的格式保存为列表元素。那么有没有能够真实/完整的方法提取字符串中的数值呢?
string = "轻型车:共有198家企业4747个车型(12305个信息公开编号)15498915辆车进行了轻型车国六环保信息公开与上周汇总环比增加105个车型、386379辆车。其中,国内生产企业177家、4217个车型、14645390辆,国外生产企业21家、530个车型、853525辆;轻型汽油" # 字符串赋值
num_list_new = [] # 新建空列表,用以存储提取的数值
a = '' # 将空值赋值给a
for i in string: # 将字符串进行遍历
if str.isdigit(i): # 判断i是否为数字,如果“是”返回True,“不是”返回False
a += i # 如果i是数字格式,将i以字符串格式加到a上
else:
a += " " # 如果i不是数字格式,将“ ”(空格)加到a上
# 遍历后,a的值为:
# 198 4747 12305 15498915 105 386379 #177 4217 14645390 21 530 853525
#数字与数字之间存在许多空格,所以需要对字符串a按''进行分割。
num_list = a.split(" ") # 按''进行分割,此时a由字符串格式编程列表
print("num_list is \n", num_list)
# 分割后,a的值为:['', '', '', '', '', '', '198', '', '', '4747', '', '', '', '12305', '', '', '', '', '', '', '', '15498915', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '105', '', '', '', '386379', '', '', '', '', '', '', '', '', '', '', '', '177', '', '4217', '', '', '', '14645390', '', '', '', '', '', '', '', '21', '', '530', '', '', '', '853525', '', '', '', '', '', '']。应该去掉空格,并将字符串格式的数字转化为int格式(主要是字符串中的数字皆为整数,如果有小数,应转化为float格式)。
for i in num_list: # 对列表a,进行遍历
try: # try 结构体,防止出错后直接退出程序
if int(i) > 0:
num_list_new.append(int(i)) # 如果列表a的元素为数字,则赋值给num_list_new
else:
pass # 如果不是数字,pass
except:
pass
print("num_list is \n", num_list_new)
#打印出的结果[198, 4747, 12305, 15498915, 105, 386379, 177, 4217, 14645390, 21, 530, 853525]。是我们需要的数字。
print("len(num_list_new)", len(num_list_new)) # 作为验证,可以数一下列表元素个数
#打印结果为:12
涉及字段提取,怎么可以忘记正则表达式!但需要引入re(正则表达式)模块。
import re
string = "轻型车:共有198家企业4747个车型(12305个信息公开编号)15498915辆车进行了轻型车国六环保信息公开,与上周汇总环比增加105个车型、386379辆车。其中,国内生产企业177家、4217个车型、14645390辆,国外生产企业21家、530个车型、853525辆;轻型汽油"
a = []
a = re.findall("\d+\.?\d*", string) # 正则表达式
print(a)
# 打印结果:['198', '4747', '12305', '15498915', '105', '386379', '177', '4217', '14645390', '21', '530', '853525']
#for i in range(len(a)): # 列表a元素转化为int格式
# a[i] = int(a[i])
a = list(map(int,a)) #可以替代上面两行代码
print(a)
# 打印结果[198, 4747, 12305, 15498915, 105, 386379, 177, 4217, 14645390, 21, 530, 853525]
程序简单,ok