使用python获取商品描述中的型号--基于正则表达式


        在网上获取的商品描述信息或者评价信息中,由于信息主体存在于非结构数据中,实体的型号存在于商品的文本数据中。如何从文本数据中非结构化数据中获取具体的商品型号是一个非常有价值的领域。


使用正则表达式获取商品型号

          正则表达式是一种可以在文档中发现符合规定模式文本的方式,正则表达式的模式规则如下:

模        式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n} 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。
re{ n,} 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b 匹配a或b
(re) 匹配括号内的表达式,也表示一个组
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t等 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

       以上仅列出了正则表达式常用的部分匹配方式,足以看出正则表达式具有强大的描述效果。
     从网上采集的原始文档为如下形式:海尔(Haier)452升风冷无霜对开门冰箱 90度开门 66.5cm纤薄机身 低温净味 双温双控BCD-452WDPF
     可以看出需要提取的信息为:BCD-452WDPF
     分析这个任务可以看出原始文本中 存四种字符:中文、英文、数字、特殊字符。在正则表达式中:(1)中文可以使用.来表示\w进行匹配(2)英文字母组合可以使用枚举26个英文字母同时指定出现次数的方式[a-zA-z],如果出现至少一次则可以指定出现次数为+进行匹配(3)数字可以使用枚举所有数字[0-9],并指定出现次数的方式进行匹配,如果出现至少一次则可以指定出现次数为+(4)特殊字符,可以通过枚举方式列出,如[,*-+]等,如果出现0次或者多次则可以指定出现次数为
     需要提取的内容为字母、数字和横线(连字符)的组合,一般情况下型号一般都有横线(连字符),在横线的前后内容中可能存在(1)字母或者数字组合(2)纯字母(3)纯数字这三种情况。因此首先我们先将横线(连字符)放在中间“-”,指定前后的模式格式一致表现为:大写字母、小写字母或者数字至少有一个出现一次的情况“[a-zA-Z0-9]+”。因此整体模式可以写作:“[a-zA-Z0-9]+-[a-zA-Z0-9]+”

具体应用场景

  在网上抓取的淘宝数据很多数据在描述信息时都是描述信息和型号混编,想要提取相应的信息就可以使用正则表达式。
  例如我们已经获取到了部分数据并将信息保存在了一个CSV文件中,下面代码就介绍了如何通过正则表达式读取商品型号信息:

# __*__ coding=utf-8 __*__
import re
import pandas as pd

def get_productItem(goods_description):
    pattern = re.compile(r"[a-zA-Z0-9]+-[a-zA-Z0-9]+")
    return pattern.findall(goods_description)
data = pd.read_csv("D:\价格数据\8月30日\淘宝\豆浆机webData.csv",engine="python",encoding="utf-8")
data["product_type"] = data["discription"].apply(get_productItem)
print(data["product_type"] )

######代码内容 上述代码描述了如何读取数据并利用正则表达式获取产品型号,其结果如下:凡是包含产品型号的描述,其中的产品型号部分被提取了出来,而没有包含产品型号的语句得出的结果为空。 ######代码运行结果 上述结果证明:正则表达式可以在描述语句不多,且型号信息规则的情况下获取到商品的型号信息。