删除1-3位数字和字符串-r和正则表达式之前的所有字符

时间:2017-12-14 17:38:35

标签: r regex gsub data-cleaning

我需要从看起来像这样的数据中提取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毫克)等。我认为我必须手工完成这些计算。

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")

备注:

  1. quantity 1 10mg 2 2mg 3 2mg 懒散地匹配任何一个角色。

  2. .+?是一个捕获组,它匹配数字一次或多次,后跟空格零或一次,后跟文字(\\d+\\s?mg)

  3. "mg" / \\1中的gsub将模式替换为第一个捕获组中的任何内容,这是sub个案例。因此,(\\d+\\s?mg) / gsub解决方案有效地删除了除sub之外的所有内容。

  4. <digits>[space]mg是一种不同的方法,它提取模式而不是替换。在这种情况下,我直接提取str_extract

  5. 数据:

    \\d+\\s?mg