根据业务需求进行数据清洗,通过Python从字符串中提取数字。


运行环境 Runtime environment

1
2
3
操作系统: Windos10  
IDE: pycharm 2020.3.2 x64
语言: python v3.9.1

背景

某日,根据公司业务需求采集某药品信息的网站。

获取其自定的itemID时,发现它id是一段纯数字,且塞在某个HTML标签的value参数中。

而且,无其他数字造成干扰。

于是开发了一个通用python函数方法。

思路

采用正则表达式为解决需求的核心。

常用正则表达式概要

1
2
3
4
5
6
7
8
9
10
11
12
13
## 总结
## ^ 匹配字符串的开始。
## $ 匹配字符串的结尾。
## \b 匹配一个单词的边界。
## \d 匹配任意数字。
## \D 匹配任意非数字字符。
## x? 匹配一个可选的 x 字符 (换言之,它匹配 1 次或者 0 次 x 字符)。
## x* 匹配0次或者多次 x 字符。
## x+ 匹配1次或者多次 x 字符。
## x{n,m} 匹配 x 字符,至少 n 次,至多 m 次。
## (a|b|c) 要么匹配 a,要么匹配 b,要么匹配 c。
## (x) 一般情况下表示一个记忆组 (remembered group)。你可以利用 re.search 函数返回对象的 groups() 函数获取它的值。
## 正则表达式中的点号通常意味着 “匹配任意单字符”

代码

将提取到的数字合并成一串长数字

1
2
3
4
5
6
7
8
9
def pick_up_numeral(temp_str) -> str:
"""
提取字符串中的数字
:param temp_str:str, 待提取数字的字符串
:return:str
"""
import re
num_str = re.findall(r'\d', temp_str) # 在字符串中找到正则表达式所匹配的所有数字,num_str是一个list
return "".join(num_str)

提取数字(分割成列表)

1
2
3
4
5
6
7
8
9
def pick_up_numeral(temp_str) -> list:
"""
提取字符串中的数字
:param temp_str:str, 待提取数字的字符串
:return:str
"""
import re
num_str = re.findall(r'\d', temp_str) # 在字符串中找到正则表达式所匹配的所有数字,num_str是一个list
return num_str

测试

1
2
3
4
5
6
7
8

temp_str = "01234_blog.raxianch.moe_56789"

# 第一种函数运行结果
# 0123456789

# 第二种函数运行结果
# ["01234","56789"]

总结

既然是提取数字,那么数字的形式一般是:整数,小数,整数加小数;

所以一般是形如:—-.—–;

根据上述正则表达式的含义,可写出如下的表达式:”\d+.?\d*”;

\d+ 匹配1次或者多次数字,注意这里不要写成*,因为即便是小数,小数点之前也得有一个数字;

.? 这个是匹配小数点的,可能有,也可能没有;

\d* 这个是匹配小数点之后的数字的,所以是0个或者多个;