在R中使用regex提取文本时出错

时间:2018-04-23 05:48:02

标签: r regex gsub

我有一个文本字符串,如下所示:

txt = "(2) 1G–1G (0)"

并且,dataframe:

DF <- data.frame(txt = c('(2) 1G–1G (0)','(1) 1G–1G (4)','(2) 1G–1G (0)'))

我试图以如下所示的方式提取括号内的数字:

我希望提取的结果采用以下格式:

  2 - 0

我正在使用的是:

gsub('.+\\(([0-9]+)\\) 1G–1G \\(([0-9]+)\\).*$', '\\1 \\2', txt)

但我从上面得到的是:

 "(2) 1G–1G (0)"

我不确定哪里出错了。 有人可以解释一下为什么这段代码没有像我希望的那样工作吗?

3 个答案:

答案 0 :(得分:1)

您可以使用

DF$txt <- trimws(gsub("[^()–]*\\(([0-9]+)\\)[^()–]*"," \\1 ",DF$txt))
## => [1] "2 – 0" "1 – 4" "2 – 0"

请参阅regex demoR demo online

<强>详情

  • [^()–]* - ()-以外的任何0 +字符
  • \\( - (
  • ([0-9]+) - 第1组:一个或多个数字
  • \\) - )字符
  • [^()–]* - ()-以外的任何0 +字符

答案 1 :(得分:1)

您可以使用R基础regexecregmatches来提取它们,如下所示:

(df <- data.frame(txt = c('(2) 1G–1G (0)','(1) 1G–1G (4)','(2) 1G–1G (0)', 'somejunkhere')))

getNumbers <- function(col) {
  (result <- sapply(col, function(x) {
      m <- regexec("\\((\\d+)\\)[^()]*\\((\\d+)\\)", x, perl = TRUE)
      groups <- regmatches(x, m)
      (out <- ifelse(identical(groups[[1]], character(0)),
                    NA,
                    sprintf("%s - %s", groups[[1]][2], groups[[1]][3])))
    }))
}
df$extracted <- getNumbers(df$txt)
df

这会产生

            txt extracted
1 (2) 1G–1G (0)     2 - 0
2 (1) 1G–1G (4)     1 - 4
3 (2) 1G–1G (0)     2 - 0
4  somejunkhere      <NA>

答案 2 :(得分:1)

不明白为什么你会说它不起作用:

 transform(DF,extracted=sub(".*\\((\\d+).*\\((\\d+).*","\\1 - \\2",txt))
            txt extracted
1 (2) 1G–1G (0)     2 - 0
2 (1) 1G–1G (4)     1 - 4
3 (2) 1G–1G (0)     2 - 0

甚至:

List<Object[]>