从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))
主要思想是将最右边的数字与指定的 UOM 缩写匹配,优先考虑 x
周围的数字。
详情:
.*
- 除换行字符外的任何零个或多个字符,尽可能多
(?:\d(?:\.\d+)?\s*x\s*)?
- 匹配数字的可选组,然后是 .
和一个或多个数字的可选序列,然后 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*x\s*\d)
- 后跟一个 x
,包含零个或多个空白字符,然后是一个数字。
我有一组产品名称,想提取产品尺寸
(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))
主要思想是将最右边的数字与指定的 UOM 缩写匹配,优先考虑 x
周围的数字。
详情:
.*
- 除换行字符外的任何零个或多个字符,尽可能多(?:\d(?:\.\d+)?\s*x\s*)?
- 匹配数字的可选组,然后是.
和一个或多个数字的可选序列,然后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*x\s*\d)
- 后跟一个x
,包含零个或多个空白字符,然后是一个数字。