我有一个文本字符串,如下所示:
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)"
我不确定哪里出错了。 有人可以解释一下为什么这段代码没有像我希望的那样工作吗?
答案 0 :(得分:1)
您可以使用
DF$txt <- trimws(gsub("[^()–]*\\(([0-9]+)\\)[^()–]*"," \\1 ",DF$txt))
## => [1] "2 – 0" "1 – 4" "2 – 0"
<强>详情
[^()–]*
- (
,)
和-
以外的任何0 +字符\\(
- (
([0-9]+)
- 第1组:一个或多个数字\\)
- )
字符[^()–]*
- (
,)
和-
以外的任何0 +字符答案 1 :(得分:1)
您可以使用R
基础regexec
和regmatches
来提取它们,如下所示:
(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[]>