EXCEL 使用正则表达式

本文介绍如何使用Excel的VBA函数结合正则表达式从商品标题中精确提取型号信息,通过详细解析正则表达式的构造思路,帮助读者理解和应用。

本文参考:

https://blog.youkuaiyun.com/laoyebin/article/details/5377857(EXCEL里常用的几个正则表达式)

https://blog.youkuaiyun.com/catoop/article/details/70247105(Excel 正则表达式提取值)

 

 

  • 今天一个朋友让我帮忙将一组 淘宝的宝贝标题里面提取出型号:
 AB
1商品名称(比较典型的原始数据)

型号(输出结果)

2美的(Midea) 电饭煲 智能IH加热 家用电饭锅 4L MB-FS4006MB-FS4006
3美的(Midea) 多用途锅 4.5L 家用电火锅鸳鸯锅 1500W MC-WLHN32AMC-WLHN32A
4美的(Midea) 电水壶HE1504a 家用便捷式烧水壶四段温304不锈钢电热水壶HE1504a
5美的(Midea)电热水瓶PF708c-50T双出水5段温控 家用5升电热水壶304不锈钢电水壶PF708c-50T
6美的(Midea)电压力锅 IH电磁加热可中途加菜钢胆5L高压锅 MY-HT5077PMY-HT5077P
7美的(Midea) 破壁机 真空辅食机 智能家用多功能果汁机 榨汁机 MJ-BL1507AMJ-BL1507A
8美的(Midea) 电磁炉 恒匀火 十档火力调节 一键桑拿蒸C21-QH2130(赠不锈钢蒸锅)C21-QH2130
9 美的(Midea)电炖锅  煲汤锅 电砂锅 隔水炖 火山陶釜三胆 4L电炖盅 TGS40WTGS40W
10美的(Midea)电热水壶即热式不锈钢电水壶 6段温控烧水壶 3L/3升台式饮水机MK-HE3001MK-HE3001
11美的(Midea)电磁炉 纤薄匀火滑动触控 家用火锅炉 C21-RH2153火力时间双显示C21-RH2153
12美的(Midea) 电磁炉HST2105 红外火力 不挑锅具 红外炉双环控火电陶炉HST2105
13美的(Midea)电饭煲 2L智能IH加热 家用迷你智能预约触摸操控 小电饭锅MB-FZ2001MB-FZ2001
14美的(Midea)电压力锅 球形内胆可作电饭煲 5L压力锅 家用双胆高压锅YL50Easy301YL50Easy301
15美的(Midea)电饼铛MC-JK30Easy301家用煎烤机双面加热煎饼铛早餐机自动断电煎饼机MC-JK30Easy301
16美的(Midea) 空气炸锅 家用全自动  高光耐热PP材料白色 MF-WZN3201空气无油炸锅MF-WZN3201
17美的(Midea) 多用途锅 多功能家用电火锅 蒸锅 6L MC-LHN30CMC-LHN30C
18美的(Midea) 电饭煲 3L家用智能预约  不锈钢拉丝机身电饭锅 MB-FS3073MB-FS3073
19美的(Midea)电热水瓶 热水壶电水壶304不锈钢 电热水壶热水瓶MK-SP50Colour201MK-SP50Colour201
20美的(Midea)多用途锅ZG26EASY401 食品级不锈钢 三层大容量电蒸锅 电蒸笼ZG26EASY401


Function GetStr(rng As Range)
    With CreateObject("VBscript.regexp")
        .Global = True
        .Pattern = "\d+\*\d+\+{0,1}\d{0,}"    '表达式
        If .Execute(rng).Count = 0 Then
            GetStr = ""
        Else
            GetStr = .Execute(rng)(0)
        End If
    End With
End Function
 

  • 因为我要测试表达式,所以需要在表格中不断的修改正则表达式,于是将上述代码稍加修改后得到:

(代码的用法就不敷述了)

Function GetStr(rng As Range, str As String)
'第一个参数rng为区域保持不变, 添加第二个参数str(作为正则表达式)
    With CreateObject("VBscript.regexp")
        .Global = True
        .Pattern = str   '表达式,直接从用户函数的第二个参数中调用
        If .Execute(rng).Count = 0 Then
            GetStr = ""
        Else
            GetStr = .Execute(rng)(0)
        End If
    End With
End Function

下面介绍一下我所用的正则表达式以及思路:

  • B1单元格中函数如下:
=getstr(A1,"((?!Midea)(?![0-9]{3,})[\w]{1,19}[-]{1}[\w]{1,19})|(?!Midea)(?![0-9]{3,})[0-9A-Z]{0,19}[-]{0,1}[0-9A-Z]{1}(\w{3,10})")

第二个参数的的内容为从‘ | ’这个符号分成两部分理解:

  1. ((?!Midea)(?![0-9]{3,})[\w]{1,19}[-]{1}[\w]{1,19})
    其中:
    (?!Midea)     表示不包含字符“Midea” 因为每一行里面都有这个
    (?![0-9]{3,})表示不包含以3个及以上的数字组合的开头(故将其放置在前面),目的是为了排除第三行中的1500W
    [\w]{1,19}数字及大小写字母1,19个长度的组合
    [-]{1} 紧接着后面一定会有一个“-”减号
    [\w]{1,19}最后数字及大小写字母1,19个长度的组合,之所以是19这个数只是为了能够包含住所有应该匹配到的型号
    这样的结果就是所有带有“-”减号的型号
  2. (?!Midea)(?![0-9]{3,})[0-9A-Z]{0,19}[-]{0,1}[0-9A-Z]{1}(\w{3,10})"
    这是“|”符号后面的部分,“|”表示“或”的意思,即前面的没有匹配到就用后面的匹配
    前面的一样的就不重复介绍了,从不一样的开始介绍:
    [0-9A-Z]{0,19}开头为数字或大写字母,且长度为0到19位字符的(因为是从0开始的,所以可以有也可以没有)
    [-]{0,1}表示后面紧接零个或者1个“-”减号
    [0-9A-Z]{1}前面两个有可能都没有,也就是说这里有可能是开头的字符,必须为大写字母或数字
    (\w{3,10})最后的字符可以是大小写字母或数字,长度为3到10个字符

源文件下载:

https://download.youkuaiyun.com/download/qq_25846269/11159568

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值