我有一套产品名称,想提取产品尺寸
(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
-一个或多个数字,然后是.
和一个或更多数字的可选序列,然后是整个单词的kg
或g
或ml
或l
|
-或(?<!d)
-不允许紧邻左边的数字d+(?:.d+)?(?:k?g|m?l)
-一个或多个数字,然后是可选的.
和一个或更多数字序列,然后是kg
/g
/ml
或l
(?=s*xs*d)
-后面跟着一个x
,用零个或多个空白字符和一个数字括起来