Python正则表达式之提取指定字符串内容后的数值

25 篇文章 11 订阅
5 篇文章 0 订阅
这篇博客介绍了如何利用Python的正则表达式从CSV文件中提取散装商品的高值、高高值和中值的斤重信息。首先,通过观察数据结构,确定了匹配模式;然后,定义了正则表达式来抓取特定值,并创建了函数以应用这些表达式;最后,提取出斤重并转换为浮点数,以便进行后续的销售总额计算。博客强调了非贪婪匹配的重要性,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

需求:提取散装商品斤重统计表格中describe列中高值、高高值、中值的斤重
describe列样例如下,高值、高高值、中值分别对应不同的价格分类,我们需要提取不同价格的斤重,以计算总的销售额。如果只是几行这样的记录,直接人工提取就很方便了。样例中可以看出高值3斤,高高值2斤,中值1斤。但是如果有很多这样的行记录,人工取值在这里显然是行不通了,这里考虑使用正则表达式模糊匹配后来提取数值。这里需要提醒的一项是,每行记录不一定三种值的斤重都存在,有可能仅存1种或者2种值的斤重,但不同价格分类只会对应一个斤重。

“内容项1名称:【必填项】高值(abrand/bbrand/cbrand) 内容项1形式:照片
内容项1照片:https//somewebsite.com.cn/public/uploads/task_info/0371e9c843d57d6a84f05975262c34f6.jpg,https//somewebsite.com.cn/public/uploads/task_info/6ec4cf6131b8874c6e1f87ca8092f8a8.jpg
内容项1输入内容:填写斤数:3 斤 内容项2名称:高高值(dbrand) 内容项2形式:照片
内容项2照片:https//somewebsite.com.cn/public/uploads/task_info/090e12e563ffe3a5c8828f3293bae1d1.jpg,https//somewebsite.com.cn/public/uploads/task_info/da3e7a3ba49b00deec91e02db4cb3ad7.jpg
内容项2输入内容:填写斤数:2 斤 内容项3名称:中值(ebrand) 内容项3形式:照片
内容项3照片:https//somewebsite.com.cn/public/uploads/task_info/7c89b720d7949602be71d6d9f2712d61.jpg,https//somewebsite.com.cn/public/uploads/task_info/815430fa71db8dc0cb4b5407e02128d3.jpg
内容项3输入内容:填写斤数:1 斤”

第一步:
我们先观察下数据,发现高值、高高值、中值后边都有一个括号,里边标示了不同值对应的品牌名称,这里我们使用值类型+品牌名称来作为不同价值的商品分类其实更精确,因为高值和高高值这两个描述的后两位都叫“高值",在模糊处理的时候很容易混淆。然后发现斤重数值在“填写斤数:”和””这两个文本之间。

第二步:先将高值、高高值、中值的文字信息分别提取出来

import pandas as pd
import numpy as np
import re
file_path=r"E:\散装商品斤重统计.csv"
data=pd.read_csv(file_path)
pattern_1=re.compile(r"高值(abrand/bbrand/cbrand).*填写斤数.*?斤")#高值 非贪婪匹配正则表达式
pattern_2=re.compile(r"高高值(dbrand).*填写斤数.*?斤")#高高值 非贪婪匹配正则表达式
pattern_3=re.compile(r"中值(ebrand).*填写斤数.*?斤")#中值 非贪婪匹配正则表达式
def split_func_1(x):
    if pattern_1.search(x):
        return(pattern_1.findall(x)[0])
def split_func_2(x):
    if pattern_2.search(x):
        return(pattern_2.findall(x)[0])
def split_func_3(x):
    if pattern_3.search(x):
        return(pattern_3.findall(x)[0])
data["高值"]=data["describe"].apply(split_func_1)
data["高高值"]=data["describe"].apply(split_func_2)
data["中值"]=data["describe"].apply(split_func_3)

这样我们就分别将高值、高高值、中值的文本信息分别提取到不同的列中了,如果所在行的describe列中没有高值记录,那么该行的“高值”列也会为None。注意这里的正则标识式我们使用了非贪婪匹配,即在正则标识式使用了 ?字符,即匹配满足条件最短的字符串。关于非贪婪匹配,可以参考Python正则表达式之初识正则表达式的最后的部分。

第三步:分别提取高值列、高高值列、中值列中的斤重信息

pattern=re.compile(r"(?<=填写斤数:)[0-9.]+")#提取“填写斤数:”字符后边的数值(或者这里描绘成数字和小数点会更为准确)信息,即斤重信息。
def extract_func(x):
    if pattern.search(x):
        return(pattern.findall(x)[0])
#将高值、高高值、中值列的字符类型转为str,因为如果不转为string类型的话,在该列就无法使用str的函数
data["高值"]=data["高值"].astype(str)
data["高高值"]=data["高高值"].astype(str)
data["中值"]=data["中值"].astype(str)
#提取斤重数值并将其转为float类型
data["高值斤重"]=data["高值"].apply(extract_func).astype(np.float)
data["高高值斤重"]=data["高高值"].apply(extract_func).astype(np.float)
data["中值斤重"]=data["中值"].apply(extract_func).astype(np.float)

通过上述操作我们就分别提取到了每行的高值斤重、高高值斤重、中值斤重。
高值斤重列求和X高值每斤价格+高高值斤重列求和X高值每斤价格+中值斤重列求和X中值每斤价格,这样我们就算得了散装商品总的销售额了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值