我需要从看起来像这样的数据中提取mg数量:
(100) x 10mg zepose valium ..(cipla in strips)
-- 20x2mg -- diclazepam
(10) clonazepam 2mg / roche rivotril
...
在R中,我使用此正则表达式删除“mg”之后的所有文本:
dataset$quantity <- gsub('mg.+?$','mg',dataset$quantity)
输出如下:
(100) x 10mg
-- 20x2mg
(10) clonazepam 2mg
如何在保留数量的同时删除'mg'之前的文字?范围从1mg到200mg,所以从一到三位数。
有时在mg数字之前有空格,但并非总是如此。然而,一种模式是在mg数量之前从不存在数字(除非用空格分隔)。
基于我对正则表达式的有限理解,我因此寻找能够删除1-3位数字和'mg'之前的所有字符的代码。我环顾四周,找不到我需要的东西。
编辑:
我想要的输出是:
10mg
2mg
2mg
请忽略该文字指的是1000毫克(100 x 10毫克),40毫克(20 x 2毫克)等。我认为我必须手工完成这些计算。
答案 0 :(得分:1)
1)sub 匹配1-3个数字之后的所有内容,然后是mg后跟其他任何东西,并将其替换为与数字和mg组成的捕获组(括号部分)匹配:
dat <- c("(100) x 10mg zepose valium ..(cipla in strips)",
"-- 20x2mg -- diclazepam",
"(10) clonazepam 2mg / roche rivotril")
sub(".*?(\\d{1,3}mg).*", "\\1", dat)
## [1] "10mg" "2mg" "2mg"
如果您不想退回mg
部分,请在mg之前而不是之后使用右括号。
2)strcapture 另一种可能性是
strcapture("(\\d{1,3}mg)", dat, data.frame(mg = character(0)))
给出这个数据框:
mg
1 10mg
2 2mg
3 2mg
更新:有关计算mg次数的问题有更新:
DF <- strcapture("(\\d+)\\D+(\\d+)", dat, data.frame(qty = numeric(0), mg = numeric(0)))
transform(DF, total = qty * mg, desc = sub(".*mg *", "", dat))
,并提供:
qty mg total desc
1 100 10 1000 zepose valium ..(cipla in strips)
2 20 2 40 -- diclazepam
3 10 2 20 / roche rivotril
答案 1 :(得分:1)
使用gsub
/ sub
(在这种情况下哪个不重要,因为每行只有一个mg
:
dataset$quantity <- gsub('.+?(\\d+\\s?mg).+', '\\1', dataset$quantity)
或来自str_extract
的{{1}}:
stringr
<强>结果:强>
library(stringr)
dataset$quantity = str_extract(dataset$quantity, "\\d+\\s?mg")
备注:强>
quantity
1 10mg
2 2mg
3 2mg
懒散地匹配任何一个角色。
.+?
是一个捕获组,它匹配数字一次或多次,后跟空格零或一次,后跟文字(\\d+\\s?mg)
。
"mg"
/ \\1
中的gsub
将模式替换为第一个捕获组中的任何内容,这是sub
个案例。因此,(\\d+\\s?mg)
/ gsub
解决方案有效地删除了除sub
之外的所有内容。
<digits>[space]mg
是一种不同的方法,它提取模式而不是替换。在这种情况下,我直接提取str_extract
。
数据:强>
\\d+\\s?mg