【问题标题】:Delete all characters before 1-3 digits and string - r and regex删除 1-3 位数字和字符串之前的所有字符 - r 和正则表达式
【发布时间】:2017-12-14 17:38:34
【问题描述】:

我需要从如下所示的数据中提取毫克数量:

(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

请忽略文中指的是 1000mg (100 x 10mg)、40mg (20 x 2mg) 等。我认为我将不得不手动进行这些计算。

【问题讨论】:

  • 不太清楚你想要的输出是什么。例如,您想要(100) x 10mg 还是只是10mg?您能否在问题中提供所需的输出?
  • 如果数字既可以是浮点数也可以是整数,请使用sub('.*?(\\d[0-9.]*\\s*mg).*','\\1',x)

标签: r regex gsub


【解决方案1】:

使用gsub/sub(在这种情况下无论是哪一个都没有关系,因为每行只有一个mg):

dataset$quantity <- gsub('.+?(\\d+\\s?mg).+', '\\1', dataset$quantity)

或与str_extract 来自stringr

library(stringr)
dataset$quantity = str_extract(dataset$quantity, "\\d+\\s?mg")

结果:

  quantity
1     10mg
2      2mg
3      2mg

注意事项:

  1. .+? 一次或多次延迟匹配任何字符。

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

  3. \\1 in gsub/sub 将模式替换为第一个捕获组中的任何内容,在本例中为 (\\d+\\s?mg)。因此gsub/sub 解决方案有效地删除了除&lt;digits&gt;[space]mg 之外的所有内容。

  4. str_extract 是一种不同的方法,它提取模式,而不是替换。在这种情况下,我直接提取\\d+\\s?mg

数据:

dataset = structure(list(quantity = c("(100) x 10mg zepose valium ..(cipla in strips)", 
"-- 20x2mg -- diclazepam", "(10) clonazepam 2mg / roche rivotril"
)), class = "data.frame", row.names = c(NA, -3L), .Names = "quantity")

【讨论】:

    【解决方案2】:

    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
    

    更新:关于计算数量乘以毫克的问题有更新:

    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
    

    【讨论】:

    • 谢谢你这工作。对于可能正在寻找的其他人,我使用 gsub 进行了此操作: dataset$quantity
    • 已添加有关返回数量 * mg 的更新
    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 2011-09-08
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多