前言
在实作时,常常会把所有资讯存成 csv 档做纪录,用 pandas 的 read_csv 读取后,以 DataFrame 的方式浏览,不过这样内容就会是以「字串」的方式来储存,如果需要用到储存的数值时就有点麻烦,所以本篇会介绍一些从字串取出数字的方法。
重点摘录
方法一:number_from_string.get_nums()
方法二:.isdigit()
方法三:re.findall(r'-?\d+\.?\d*', list)
方法介绍
好用的放在前面~
方法一:现成套件 (number_from_string)
使用 number_from_string
当中的 get_nums()
得到的数字直接是数值型态
安装指令:
pip install nums_from_string
範例:
# 载入现成套件import nums_from_string as nfs# 使用 get_nums() 函数string_with_number = '[6, 7, 8, 9, 10, 11, 12, 13, 14]'number_list = nfs.get_nums(string_with_number)print('Extracted numbers: ', number_list)print('Type of item in "number_list": ', type(number_list[0]))>>> Extracted numbers: [6, 7, 8, 9, 10, 11, 12, 13, 14]>>> Type of item in "number_list": <class 'int'>
方法二:isdigit()
把字串中每个字元拆开,依序用 isdigit() 来判断是不是数字,是的话再看要转换成什么数值型态 (可以用 int(), flost()),再储存到 list 里面
缺点:
这个方法的问题在于,要依据什么来分割字串,str.split() 默认设定是根据空格,但如果字串比较複杂这个方法就比较不适合。另外一个直接的问题是,如果以字元为单位来分割的话(如下面範例),非个位数的位数就会被拆开,旧问题就满严重的~
範例:
# 将字串拆开,依序用 isdigit() 来判断是否为数字string_with_number = '[3, 4, 5, 6, 7, 8]'number_list = [int(item) for item in string_with_number if item.isdigit()]print('Extracted numbers: ', number_list)print('Type of item in "number_list": ', type(number_list[0]))>>> Extracted numbers: [3, 4, 5, 6, 7, 8]>>> Type of item in "number_list": <class 'int'>
方法三:正规表达式
这个方法我觉得相对麻烦,但如果要筛选的情况比较特别,想要设定一些条件的话,这个方法满值得试试看~
正规表达式简介
正规表达式的基本概念就是:[某个或某类匹配内容] 加上 [设定匹配出现的情况]
一些基本正规表达式的意思如下:*
表示比对内容可以出现 0 次或多次?
表示比对内容可以出现 0 或 1 次+
表示比对内容至少出现 1 次,没有上限\
则是可以粗分成两种来说明:
下面直接来解释参考文献中举的例子:
针对 '-?\d+\.?\d*'
这一串来做个解析,来看为什么这一串可以帮助我们找到字串中的数字:
-?
:负号出现0次或1次\d+
:0 到 9 至少出现一次\.?\d*
:这边表有小数点的情况考虑进去(小数点可以出现 0 次或 0 次),以及后面可以再接数字(数字可以出现 0 次或多次)参考文献中举的例子:
# 先载入正规表达式的套件 re (Regular Expressions)import re# 使用 re.findall()sentence = 'Extract 100 , 100.45 and 10000 from this string's = [float(s) for s in re.findall(r'-?\d+\.?\d*', sentence)]print(s)>>> [100.0, 100.45, 10000.0]
谢谢大家看到这边,如果有错误的地方,或是想讨论的,欢迎在下方留言~