正则表达式,用于从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))

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

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演示。

其主要思想是将最右边的数字与指定的UOM缩写相匹配,使x周围的数字具有优先级。

详细信息

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

相关内容

  • 没有找到相关文章

最新更新