从R中的产品名称获取产品属性的正则表达式

Regular expression to get product attribute from product name in R

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

产品名称有点乱。没有产品的具体位置size/formatting。例如,

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 中使用它。所以,不确定如何编写表达式来涵盖这里的所有情况。

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

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))

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

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))

参见regex demo online

主要思想是将最右边的数字与指定的 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,包含零个或多个空白字符,然后是一个数字。