python环境下从字符串中提取数字

标题:python环境下从字符串中提取数字

在实际编程应用中,经常需要从一堆文字中提取数值。笔者在爬虫应用中就遇到了这个问题,现找到两种解决方案,供参考!

一些环境准备类的话就不多说了,直接上代码!

将需要的一段文字以字符串的格式赋值给一个变量(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

你可能感兴趣的:(机器学习,字符串,python,正则表达式,列表)