首页 > 解决方案 > 从R中的产品名称获取产品属性的正则表达式

问题描述

我有一组产品名称,想提取产品尺寸
(1237ml、370ML、850g、2400g、11.2kg、11.2kg、2g、200g、300g)

产品名称有点乱。产品尺寸/格式没有具体位置。例如,

strings <- c("product brand A 1237ml Bundle of 6" 
            , "product milk choc370ML" 
            , "brand milk Vanilla Flavor 850g" 
            , "One 2400g, For 0-6 Month-Old Infants" 
            , "a+...two...6-12months...11.2kg...milk" 
            , "a+...two...11.2kg 6-12months ..milk" 
            , "Product 200g (10x2g)"
            , "[200g] Product" 
            , "Product A brand(300g)"
)

我对正则表达式非常陌生,并试图在 R 中使用它。所以,不知道如何编写表达式来涵盖这里的所有情况。

下面是我正在使用的代码。如前所述,它们仅适用于某些情况。有人可以指导我该案例的正确/适用表达方式吗?

extract1<-trimws(gsub(".* ([a-zA-Z0-9]+).*", "\\1", product))
extract2<-trimws(gsub(".*(...[0-9][Mm][Ll]).*", "\\1", product))
extract3<-trimws(gsub(".*(..[0-9][Mm][Ll]).*", "\\1", product))
extract4<-trimws(gsub(".*(...[0-9][Gg]).*", "\\1", product))
extract5<-trimws(gsub(".*(..[0-9][Gg]).*", "\\1", product))
extract6<-trimws(gsub(".*(...[0-9].[Gg]).*", "\\1", product))
extract7<-trimws(gsub(".*(..[0-9].[Gg]).*", "\\1", product))

标签: rregexdata-cleaninggsub

解决方案


您的要求非常复杂,但如果您打算使用单个正则表达式来提取这些值,您可以使用

regmatches(strings, regexpr(".*(?:\\d(?:\\.\\d+)?\\s*x\\s*)?\\K(?<!\\d)\\d+(?:\\.\\d+)?(?:k?g|m?l)\\b|(?<!\\d)\\d+(?:\\.\\d+)?(?:k?g|m?l)(?=\\s*x\\s*\\d)", strings, perl=TRUE, ignore.case=TRUE))

在线查看正则表达式演示

主要思想是匹配最右边的数字,后面跟着指定的 UOM 缩写,优先考虑周围的数字x

详情

  • .*- 除换行符以外的任何零个或多个字符,尽可能多
  • (?:\d(?:\.\d+)?\s*x\s*)?- 一个与数字匹配的可选组,然后是一个可选序列.和一个或多个数字,然后是一个x用零个或多个空格括起来的
  • \K-匹配重置运算符,丢弃到目前为止匹配的文本
  • (?<!\d)\d+(?:\.\d+)?(?:k?g|m?l)\b- 一个或多个数字,然后是一个或多个数字的可选序列,.然后是kggmll作为整个单词
  • |- 或者
  • (?<!\d)- 不允许紧靠左边的数字
  • \d+(?:\.\d+)?(?:k?g|m?l)- 一个或多个数字,然后是一个或多个数字的可选序列.,然后kg/ g/mll
  • (?=\s*x\s*\d)- 后跟一个x用零个或多个空格字符括起来的字符,然后是一个数字。

推荐阅读