r - 从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))
在线查看正则表达式演示。
主要思想是匹配最右边的数字,后面跟着指定的 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
用零个或多个空格字符括起来的字符,然后是一个数字。
推荐阅读
- excel - 在句子中查找单词的公式
- python - 为什么我只有在不使用今天的日期时才有不同的数组尺寸?
- linux - 编写一个 shell 脚本,该脚本接受一系列 3 个代表文件类型的字符串作为命令行参数
- angular - 对@output 装饰器行为感到困惑
- ios - 将过滤器应用于特定的图像分割遮罩
- angular - 在新窗口中弹出角垫对话框
- ios - 应用商店应用上传失败,出现错误 ITMS-90534 和警告 ITMS-90703
- python-3.x - 模板化 Python 类级属性以创建通用的 rest 序列化器
- c++ - 试图找到一种更好的方法来组合不同线程的计算结果(OpenMP)
- linux - 如何在python 2.7中返回带有ctypes的指针字符串